2016-12-07 8 views
1

У меня возникают проблемы с созданием отчетов с PHPExcel в Laravel 4.2, количество строк, полученных из базы данных, очень велико (более 500 тысяч строк), поэтому создаваемые массивы используют много Памяти PHP и генерации окончательного файла, который заканчивается. Причинение переполнения памяти. Я попытался использовать систему кэширования PHPExcel, но также использует много системной памяти. Есть ли другое решение, которое я могу использовать? Я подумал о частичном создании обработки записей, например, 5 тысяч строк за раз, но я не знаю, решит ли эта проблема моя проблема.Решение для создания отчетов с PHPExcel в Laravel 4.2

код, который я использую, чтобы использовать кэш PHPExcel (discISAM):

public function __construct() { 
     $templateFileName = $this->getTemplateFileName(); 
     $fullPathTemplate = public_path().'/Temp/'.$templateFileName.'.xlsx'; 

     // $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp; 
     $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_to_discISAM; 

     $cacheSettings = array(
      // 'memoryCacheSize' => '150MB' 
      'dir' => 'public/Temp/cache' 
     ); 
     $cacheAtivo = \PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 
     if (! $cacheAtivo) { 
      die($cacheMethod . " Cache invalido " . EOL); 
     } 

     $objPhpReader = new \PHPExcel_Reader_Excel2007(); 
     $this->phpExcelObject = $objPhpReader->load($fullPathTemplate); 
} 

Спасибо заранее за внимание каждого.

ответ

0

Вы можете проверить Chunk Method, чтобы ограничить строки, а затем для каждой записи в файл. Кусок был сделан для этой цели

отрывов Результатов

Если вам нужно обработать много (тысячи) красноречивые записей, с помощью команды чанки позволит вам обойтись без еды всех оперативной памяти:

User::chunk(200, function($users) 
{ 
    foreach ($users as $user) 
    { 
     // 
    } 
}); 

Первый аргумент, переданный методу, - это количество записей, которые вы хотите получить за «кусок». Закрытие передано, поскольку второй аргумент будет вызываться для каждого фрагмента, который вытаскивается из базы данных.