>  기사  >  백엔드 개발  >  PHPExcel은 대량의 데이터 시간 초과 및 메모리 오류 솔루션을 내보냅니다.

PHPExcel은 대량의 데이터 시간 초과 및 메모리 오류 솔루션을 내보냅니다.

巴扎黑
巴扎黑원래의
2016-11-11 14:50:362154검색

PHP로 Excel을 내보낼 때 많은 어린이들이 경험한 문제입니다. phpexcel 클래스를 사용하면 정말 편리하지만, 빅데이터를 내보낼 때 시간 초과나 메모리 오버플로 문제가 자주 발생합니다. , 함께 배우고 함께 발전해 보세요. . .

PHPExcel은 엑셀 처리를 위한 매우 강력한 PHP 오픈소스 클래스이지만 메모리를 너무 많이 차지한다는 점이 큰 문제이다. 1.7.3부터 셀 캐시 방식 설정을 지원하지만 권장한다. 현재 안정 버전 1.7.6을 사용하려면 이전 버전에 다양한 정도의 버그가 있으므로 공식 문서는 다음과 같습니다.

PHPExcel1.7.6 공식 문서는

PHPExcel에서 평균 셀 캐싱은 PHPExcel이 디스크나 APC, Memcache 또는 Wincache에서 더 작은 크기의 메모리로 셀 개체를 유지할 수 있도록 하는 메커니즘을 제공합니다. 이는 PHP 메모리보다 큰 통합 문서의 메모리 사용량을 줄일 수 있지만 셀 데이터에 액세스하는 속도는 저하됩니다.

PHPExcel은 평균 1k/셀의 메모리를 사용하므로 큰 문서에서는 메모리가 발생합니다. 또한 매우 빨리 소비됩니다. 셀 캐싱 메커니즘을 사용하면 PHPExcel이 디스크 메모리나 APC, Memcache 또는 Wincache에 있는 작은 셀 개체를 캐시할 수 있습니다. 비록 데이터를 읽는 데 시간이 좀 걸리지만 메모리 소비를 줄이는 데 도움이 될 수 있습니다.

PHPExcel1.76. 공식 문서에서는

기본적으로 PHPExcel은 여전히 ​​모든 셀 개체를 메모리에 보유하지만 셀 캐싱을 활성화하려면 PHPExcel_Settings::를 호출해야 합니다. setCacheStorageMethod() 메서드를 사용하여 사용하려는 캐싱 메서드를 전달합니다.

기본적으로 PHPExcel은 여전히 ​​셀 개체를 메모리에 저장하지만 사용자 정의할 수 있습니다. PHPExcel_Settings::setCacheStorageMethod() 메서드를 사용하고 캐싱 메서드를 이 메서드에 매개 변수로 전달하여 캐싱 메서드를 설정할 수 있습니다.

PHP 코드:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory;

PHPExcel_Settings::setCacheStorageMethod($cacheMethod)

PHPExcel1.7. 공식

setCacheStorageMethod()로 작성된 문서는 성공 시 true를 반환하고, 실패 시 false를 반환합니다(예: APC가 활성화되지 않은 상태에서 APC에 캐시를 시도하는 경우).

setCacheStorageMethod()는 BOOL 형 변수를 사용하여 설정 성공 여부를 나타냅니다. (예를 들어 APC를 사용할 수 없고 APC 캐시를 사용하도록 설정한 경우 false가 반환됩니다.)

PHPExcel1.7.6 공식 문서 작성

개별 워크시트마다 별도의 캐시가 유지되며, 사용자가 구성한 캐싱 방법 및 설정에 따라 워크시트가 인스턴스화될 때 자동으로 생성됩니다. 통합 문서 읽기를 시작한 후에는 구성 설정을 변경할 수 없습니다.

각 워크시트에는 독립적인 캐시가 있습니다. 워크시트가 인스턴스화되면 캐시 방법 설정 또는 구성에 따라 자동으로 생성됩니다. 파일 읽기를 시작하거나 첫 번째 워크시트를 만든 후에는 캐싱 방법을 변경할 수 없습니다.

PHPExcel1.7.6 공식 문서에 적힌 내용

현재 사용 가능한 캐싱 방법은

현재 사용 가능한 캐싱 방법은

PHP 코드입니다. :

PHPExcel_CachedObjectStorageFactory::cache_in_memory;

PHPExcel1.7.6 공식 문서에서는

캐싱 방법을 초기화하지 않으면 기본값으로 PHPExcel이 사용하는 방법입니다. 현재와 ​​같이 Cell 객체는 PHP 메모리에 유지됩니다.

기본적으로 캐시 메서드를 초기화하지 않으면 PHPExcel은 메모리 캐시 메서드를 사용합니다.

========================================== == ===

PHP 코드:

PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;

PHPExcle1.7.6 공식 문서에서는

이 캐싱 방법을 사용하여 셀을 최소한의 성능 오버헤드로 메모리 공간을 줄이는 직렬화된 객체 배열로 PHP 메모리에 보관됩니다. 상대적으로 높은 효율성과 성능을 제공하는 솔루션입니다.

========================================== == ===

PHP 코드:

PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

PHPExcel1.7.6 공식 문서는

cache_in_memory_serialized와 마찬가지로 셀을 보유합니다. 직렬화된 객체의 배열로 PHP 메모리에 저장되지만 메모리 사용량을 더욱 줄이기 위해 gzip으로 압축됩니다. 단, 셀 읽기 또는 쓰기 액세스는 약간 느립니다.

직렬화 방법과 유사하게 이 방법은 직렬화 후 gzip 압축을 수행한 다음 이를 메모리에 넣습니다. 이번에는 메모리 사용량을 더 줄이되 읽기 및 쓰기 시 약간 느려집니다.

========================================== == ==============

PHP 코드:

PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

PHPExcel1.7.6 공식 문서는

cache_to_discISAM을 사용하면 모든 셀이 임시 디스크 파일에 보관되며 해당 파일의 해당 위치에 대한 인덱스만 PHP 메모리에 유지됩니다. 이는 어떤 캐시_in_memory 방법보다 느리지만 메모리 사용량이 크게 줄어듭니다. 임시 디스크 파일은 스크립트가 종료되면 자동으로 삭제됩니다.

cache_to_discISAM을 사용하면 모든 셀이 임시 디스크 파일에 저장되며 파일의 해당 위치만 PHP 메모리에 저장됩니다. 메모리 내 캐시보다 느리지만 메모리 사용량을 크게 줄일 수 있습니다. 임시 디스크 파일은 스크립트가 종료되면 자동으로 삭제됩니다.

========================================== == ==============

PHP 코드:

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

PHPExcel1.7.6 공식 문서는

cache_to_discISAM과 마찬가지로, 캐시_to_phpTemp를 사용할 때 모든 셀은 php://temp I/O 스트림에 보관되며 해당 위치에 대한 인덱스만 PHP 메모리에 유지됩니다. 메모리의 데이터: php://temp는 유사하게 동작하지만 특정 메모리 제한에 도달하면 데이터를 저장하기 위해 임시 파일을 사용합니다. 기본값은 1MB이지만 캐시_to_phpTemp를 초기화할 때 이를 변경할 수 있습니다. > 캐시_to_discISAM과 유사하게, 캐시_to_phpTemp를 사용할 때 모든 셀은 여전히 ​​php://temp I/O 스트림에 존재하며 해당 위치만 PHP 메모리에 저장됩니다. PHP의 php://memory 래퍼는 데이터를 메모리에 저장합니다. php://temp도 비슷하게 동작하지만, 저장된 데이터의 크기가 메모리 제한을 초과하면 데이터가 임시 파일에 저장됩니다. 하지만 초기화 중에 수정할 수 있습니다.

Php 코드:

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: 캐시_to_phpTemp;

$cacheSettings = array( ' memoryCacheSize ' => ' 8MB' );

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

PHPExcel1.7.6 공식 문서는

php://temp 파일은 자동으로 삭제됩니다. 스크립트가 종료됩니다.

php://temp 파일은 스크립트가 종료되면 자동으로 삭제됩니다.

========================================== == ==============

PHP 코드:

PHPExcel_CachedObjectStorageFactory::cache_to_apc;

PHPExcle1.7.6 공식 문서는

cache_to_apc를 사용할 때 셀 개체는 셀이 존재하는지 식별하기 위해 PHP 메모리에 유지되는 인덱스만 포함하여 APC에서 유지됩니다. 기본적으로 600초의 APC 캐시 시간 초과가 사용되며 이는 대부분의 애플리케이션에 충분합니다. :cache_to_APC를 초기화할 때 변경할 수 있지만

cache_to_apc를 사용할 경우 셀은 APC에 저장되고 인덱스만 메모리에 저장됩니다. 기본 APC 캐시 시간 초과는 600초로 대부분의 애플리케이션에 충분합니다. 물론 초기화 중에 수정할 수도 있습니다.

Php 코드:



$ 캐시메소드 = PHPExcel_CachedObjectStorageFactory::cache_to_APC;

$cacheSettings = array( 'cacheTime' => 600 );

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings)

PHPEx 셀1 .7.6 공식 문서에서는 다음과 같이 기록합니다.

스크립트가 종료되면 모든 항목이 APC에서 캐시 시간 값에 관계없이 지워지므로 이 메커니즘을 사용하여 영구 저장에 사용할 수 없습니다.

스크립트 실행이 끝나면 모든 데이터가 APC에서 지워지고(캐시 시간 무시) 이 메커니즘을 영구 캐시로 사용할 수 없습니다.

========================================== == ==============

PHP 코드:



PHPExcel_CachedObjectStorageFactory::cache_to_memcache

PHPExcel1. 7.6 공식 문서에는 다음과 같이 기록되어 있습니다.

cache_to_memcache를 사용할 때 셀 객체는 Memcache에 유지되며 셀이 존재하는지 식별하기 위해 PHP 메모리에 유지되는 인덱스만 있습니다.

기본적으로 PHPExcel은 포트 11211의 로컬 호스트에 있는 Memcache 서버. 또한 Memcache 시간 초과 제한을 600초로 설정합니다. 다른 서버나 포트에서 Memcache를 실행하는 경우에는 캐시_to_memcache를 초기화할 때 다음 기본값을 변경할 수 있습니다.

Cache_to_memory를 사용하면 셀 객체는 Memcache에 저장되고, 인덱스만 메모리에 저장됩니다. 기본적으로 PHPExcel은 600초의 제한 시간으로 localhost 및 포트 11211에서 Memcache 서비스를 찾습니다. Memcache 서비스를 다른 서버나 다른 포트에서 실행하는 경우 초기화 중에 이를 수정할 수 있습니다.

Php 코드:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;

$cacheSettings = array( 'memcacheServer' => 'localhost',

'memcachePort' => 11211,

'cacheTime' => 600

)

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings)

초기화 설정 형식에서 MS는 아직 여러 Memcache 서버의 폴링을 지원하지 않는 점이 아쉽습니다.
스크립트가 종료되면 Memcache에서 모든 데이터가 삭제되며(캐시 시간 무시) 이 메커니즘은 영구 저장에 사용할 수 없습니다.

========================================== == ==============

PHP 코드:

PHPExcel_CachedObjectStorageFactory::cache_to_wincache;

PHPExcel1.7.6 공식 문서는

cache_to_wincache를 사용할 때 셀 개체는 셀이 존재하는지 식별하기 위해 PHP 메모리에 유지되는 인덱스만 사용하여 Wincache에서 유지됩니다. 기본적으로 Wincache 캐시 시간 제한은 600초로 사용되며 이는 대부분의 애플리케이션에 충분합니다. :cache_to_wincache를 초기화할 때 변경할 수 있지만

cache_towincache 메서드를 사용하면 셀 개체가 Wincache에 저장되고 인덱스만 메모리에 저장됩니다. 기본적으로 Wincache 만료 시간은 다음과 같습니다. 600초는 대부분의 애플리케이션에 매우 중요하며, 물론 초기화 중에 수정할 수 있습니다.

Php 코드:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache ;

$cacheSettings = array( 'cacheTime ' => 600 );

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings)

PHPExcel 공식 문서

스크립트가 종료되면 캐시타임 값에 관계없이 모든 항목이 Wincache에서 지워지므로 이 메커니즘을 사용하는 영구 저장에 사용할 수 없습니다.

PHPExcel은 여전히 ​​상대적으로 강력합니다. 가장 큰 문제는 메모리 사용량입니다. PHPExcel은 언제 출시됩니까? 많은 고급 기능이 필요하지 않고 가장 일반적인 데이터만 내보내면 되는 경량 버전입니다!

위 내용은 LZ가 인터넷에서 찾은 비교적 좋은 기사입니다. 비록 제 문제가 완전히 해결되지는 않았지만 잘 쓰여졌다고 생각합니다. 제가 본 아이들 신발에 도움이 될 수 있을 것 같아요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.