Как исправить исключение OutOfMemoryException в Symfony 2.7

Я использую очень интенсивную функцию памяти для создания файла экспорта csv из разных таблиц и значений SQL. Когда я выбираю набор данных, который слишком велик, я получаю эту ошибку:

OutOfMemoryException in PDOStatement.php line 105:
Error: Out of memory (allocated 1636040704) (tried to allocate 12788 bytes)

Я искал некоторые идеи, чтобы исправить это, и нашел следующие источники:

php.ini: memory_limit= '256M'

Я сделал это исправление, но оно мне не помогло.

также я нашел следующий совет:

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;

}

Спасибо за ваше время!


person helmi    schedule 09.03.2018    source источник
comment
В какой строке 105 возникает ошибка? У вас есть $response = new Response($rawData); дважды.   -  person Adder    schedule 09.03.2018
comment
Число (allocated 1636040704) говорит мне, что вам не удалось успешно изменить ограничение памяти на 256M Убедитесь, что вы отредактировали правильный файл php.ini. Обычно их 2: один для вашего веб-сервера и один для PHP CLI. Также убедитесь, что вы перезапустили свой веб-сервер после внесения изменений в правильный php.ini   -  person RiggsFolly    schedule 09.03.2018
comment
Используйте профилировщик Symfony, чтобы найти временной разрыв. удалить лишний код, например $response = new Response($rawData); И вы можете альтернативно настроить свой php.ini с неограниченным лимитом памяти, например: memory_limit= '-1'   -  person episch    schedule 09.03.2018
comment
Спасибо вам.. Мне действительно нужно было только изменить размер memory_limit во всех файлах ini, а не только в одном! После замены везде работает без нареканий!   -  person helmi    schedule 09.03.2018