Я использую очень интенсивную функцию памяти для создания файла экспорта csv из разных таблиц и значений SQL. Когда я выбираю набор данных, который слишком велик, я получаю эту ошибку:
OutOfMemoryException in PDOStatement.php line 105:
Error: Out of memory (allocated 1636040704) (tried to allocate 12788 bytes)
Я искал некоторые идеи, чтобы исправить это, и нашел следующие источники:
Я сделал это исправление, но оно мне не помогло.
также я нашел следующий совет:
config/monolog:buffer_size: 200
но мне тоже не помогло..
дальше пробовал отключать профайлер...и ничего не стало лучше!
У кого-нибудь есть другая идея? как я могу исправить эту ошибку без рефакторинга методов и запросов sql.
Следующая функция представляет эту функцию:
public function exportAction(Request $request){
//profiling data
//$stopwatch = new Stopwatch();
//$stopwatch->start('Period');
if ($this->container->has('profiler'))
{
$this->container->get('profiler')->disable();
}
$data = $this->get('session')->get('dataE');
$data = unserialize($data);
$em = $this->getDoctrine()->getManager();
// restrict search result by user rights
if ($data['mnds'] == '1' || ($this->get('security.context')->isGranted('ROLE_EPO') && !$this->isAdmin())) {
$data['registry'] = 1;
} elseif ($data['asp'] == '1' || ($this->get('security.context')->isGranted('ROLE_ASP') && !$this->isAdmin())) {
$data['registry'] = 2;
}
// Load data structure
$repo = $em->getRepository('DataLiveBundle:DataZImportStructure');
$qb = $repo->getExportQuery($data);
$dStruct = $repo->getResults($qb);
$selectFields = array();
$tableNames = array();
foreach($dStruct as $ds) {
$selectFields[] = $ds->getPrefix() . "." . $ds->getName();
$tableNames[] = $ds->getSqlname();
}
//profiling data
//$stopwatch->lap('Period');
// search data
$repo = $em->getRepository('DataLiveBundle:DataAPatient');
$dataTable = $repo->getDataExport($data, $selectFields);
// compile data
$rows = array();
$rows[0] = implode(';', str_replace(array(";", "\n"), '_', array_slice($tableNames, 0, -1)));
//$event = $stopwatch->stop('Period');
//$response = new Response("<h1>Hello World</h1>".$event->getDuration()." ms ".$event->getMemory()." memory");
foreach ($dataTable as $row) {
$cleanRow = array();
foreach ($row as $entry) {
if (is_numeric($entry)) {
$cleanRow[] = $entry;
} elseif (is_string($entry)) {
$entry = str_replace(array(";", "\n"), '_',$entry);
$cleanRow[] = preg_replace("/[\n\r]/","",$entry);
} elseif (is_a($entry, 'DateTime')) {
$cleanRow[] = $entry->format('d.m.Y');
} else {
$cleanRow[] = $entry;
}
}
$rows[] = implode(";", array_slice($cleanRow, 0, -1));
}
$rawData = implode("\n", $rows);
// prepare csv
$response = new Response($rawData);
//$response = new Response("<h1>Hello World</h1>".$event->getDuration()." ms ".$event->getMemory()." memory");
$response = new Response($rawData);
//$response->headers->set('Content-Length', filesize($rawData));
$response->headers->set('Content-Type', 'text/csv');
return $response;
}
Спасибо за ваше время!
$response = new Response($rawData);
дважды. - person Adder   schedule 09.03.2018(allocated 1636040704)
говорит мне, что вам не удалось успешно изменить ограничение памяти на256M
Убедитесь, что вы отредактировали правильный файлphp.ini
. Обычно их 2: один для вашего веб-сервера и один для PHP CLI. Также убедитесь, что вы перезапустили свой веб-сервер после внесения изменений в правильныйphp.ini
- person RiggsFolly   schedule 09.03.2018