이 문서의 내용은 파일을 내보낼 때 phpExcel 메모리 오버플로에 대한 해결 방법입니다. 특정 참조 값이 있으므로 도움이 필요한 친구에게 도움이 되기를 바랍니다.
phpExcel을 사용하여 파일을 내보낼 때 파일이 너무 커서 PHP 메모리 오버플로 오류가 자주 보고됩니다. 이 문제를 해결하려면 최적화를 위해 PHPExcel에서 제공하는 매개 변수를 사용할 수 있습니다. 여기서 언급한 엑셀 파일의 크기가 크다는 것은 반드시 파일 크기를 의미하는 것은 아니지만, 더 중요한 것은 파일에 저장된 데이터와 형식을 의미하는 것입니다. 데이터가 많고 형식이 상대적으로 풍부하면 PHP의 메모리가 쉽게 소모됩니다.
정보 2에서는 캐싱을 활성화하지 않은 상태에서 Excel의 셀이 약 1K의 메모리를 차지하며 8,000개의 행과 31개의 열(248,000개 셀)이 있는 테이블에는 242MB의 메모리가 필요하다는 점을 지적합니다. 캐싱이 활성화되면 80MB로 떨어지지만 그 효과는 여전히 매우 분명합니다.
사용 중에 PHPExcel의 메모리 최적화 매개변수는 PHPExcel 개체에 없으며 PHPExcel이 인스턴스화되기 전에 설정해야 한다는 점에 유의하세요.
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp; $cacheSettings = array( 'memoryCacheSize' => '512MB'); PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings); $oExcel = new PHPExcel();
셀 데이터를 직렬화하여 메모리에 저장합니다
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;
셀을 직렬화한 다음 Gzip 압축을 수행한 다음 메모리에 저장합니다
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
캐시를 임시 디스크 파일에 저장합니다 , 속도가 느려질 수 있습니다
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
php://temp에 저장
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
memcache에 저장
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; $cacheSettings = array( 'memcacheServer' => 'localhost', 'memcachePort' => 11211, 'cacheTime' => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
엑셀 셀 형식을 읽을 필요가 없다면 읽도록 설정하면 됩니다. 데이터만.
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("test.xlsx”);
Excel에 여러 개의 시트가 있지만 그 중 일부만 읽어야 하는 경우 메모리 소비를 줄이기 위해 설정할 수도 있습니다.
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") ); $objPHPExcel = $objReader->load("test.xlsx”);
시트의 특정 영역만 읽어야 하는 경우 필터를 설정할 수도 있습니다.
class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadFilter( new MyReadFilter() ); $objPHPExcel = $objReader->load("test.xlsx”);
결국 다음 방법을 사용했습니다
// 如果是因为特殊字符引起的,可以在load方法之前加上setReadDataOnly(意思是忽略任何格式的信息)方法,就可以避免 $objReader->setReadDataOnly(true);//只需要添加这个方法 $objPHPExcel = $objReader->load($uploadFilePath);
관련 권장 사항:
phpExcel에서 대량의 데이터를 내보낼 때 발생하는 메모리 오버플로 오류 해결 방법
phpexcel 내보낸 Excel 파일 저장 및 다운로드 관련 문제
위 내용은 파일을 내보낼 때 phpExcel 메모리 오버플로에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!