2016-12-07 57 views
1

我在使用Laravel 4.2中的PHPExcel生成報表時遇到問題,從數據庫中獲取的行數非常大(超過50萬行),因此創建的數組使用了大量的PHP內存和最終文件的生成結束導致內存溢出。我試圖使用PHPExcel緩存系統,但它也使用了很多系統內存。有沒有其他解決方案可能會使用?我想過以部分方式處理記錄的創建,例如一次處理5千行,但我不知道這些努力是否能解決我的問題。在Laravel 4.2中使用PHPExcel生成報表的解決方案

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); 
} 

預先感謝您爲大家的關注:我用用PHPExcel緩存(discISAM)

代碼。

回答

0

您可以檢查Chunk Method以限制行,然後爲每個塊寫入文件。塊是爲這個目的而作出

分塊結果

如果你需要處理的洋洋灑灑記錄了很多(千),使用大塊命令將允許你這樣做沒有吃東西了所有的RAM:

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

傳遞給方法的第一個參數是您希望每個「塊」接收的記錄數。傳遞的Closure作爲第二個參數將被從數據庫中拉出的每個塊調用。