파일을 내보낼 때 phpExcel 메모리 오버플로에 대한 솔루션

不言
풀어 주다: 2023-04-03 19:50:01
원래의
4668명이 탐색했습니다.

이 문서의 내용은 파일을 내보낼 때 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_Settings::setCacheStorageMethod()의 여러 매개변수

셀 데이터를 직렬화하여 메모리에 저장합니다

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(&#39;Excel2007&#39;);
$objReader->setReadFilter( new MyReadFilter() );
$objPHPExcel = $objReader->load("test.xlsx”);
로그인 후 복사

결국 다음 방법을 사용했습니다

// 如果是因为特殊字符引起的,可以在load方法之前加上setReadDataOnly(意思是忽略任何格式的信息)方法,就可以避免 
$objReader->setReadDataOnly(true);//只需要添加这个方法
$objPHPExcel = $objReader->load($uploadFilePath);
로그인 후 복사

관련 권장 사항:

phpExcel에서 대량의 데이터를 내보낼 때 발생하는 메모리 오버플로 오류 해결 방법

phpexcel 내보낸 Excel 파일 저장 및 다운로드 관련 문제

위 내용은 파일을 내보낼 때 phpExcel 메모리 오버플로에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿