2016-12-07 8 views
1

Laravel 4.2에서 PHPExcel을 사용하여 보고서를 생성하는 데 문제가 있습니다. 데이터베이스에서 얻은 행 수가 매우 커서 (50 만 줄 이상) 생성 된 배열이 많이 사용됩니다. PHP 메모리 및 최종 파일 생성시 메모리 오버플로가 발생합니다. 필자는 PHPExcel 캐시 시스템을 사용하려고했지만 많은 시스템 메모리를 사용하고 있습니다. 내가 사용하고있는 다른 해결책이 있습니까? 한 번에 5 천 라인의 레코드를 부분적으로 처리하는 방법에 대해 생각했지만 노력으로 인해 문제가 해결되는지는 알 수 없습니다. Laravel에서 PHPExcel을 사용하여 보고서를 생성하는 솔루션 4.2

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는 데이터베이스에서 가져온 각 청크에 대해 호출됩니다.