ホームページ  >  記事  >  バックエンド開発  >  PHPExcel エクスポート大量データのタイムアウトとメモリ エラーの解決策

PHPExcel エクスポート大量データのタイムアウトとメモリ エラーの解決策

巴扎黑
巴扎黑オリジナル
2016-11-11 14:50:362155ブラウズ

PHP を使用した Excel のエクスポートは、phpexcel クラスを使用するのが非常に便利ですが、タイムアウトやメモリ オーバーフローの問題が発生することがよくあります。一緒に学び、進歩していきます。 。 。

PHPExcel は Excel を処理するための非常に強力な PHP オープン ソース クラスですが、大きな問題はメモリを大量に消費することです。1.7.3 以降、セル キャッシュ メソッドの設定をサポートしていますが、現在のものを使用することをお勧めします。安定バージョン 1.7 .6、以前のバージョンにはさまざまな程度のバグがあるため、以下はその公式ドキュメントです:

PHPExcel1.7.6 公式ドキュメントの記述

PHPExcel はワークシート内で平均約 1k/セルを使用するため、大きなワークブックはすぐにセル キャッシュは、PHPExcel が PHP メモリではなく、より小さいサイズのメモリ、または APC、memcache、または Wincache にセル オブジェクトを保持できるようにするメカニズムを提供します。これにより、メモリ使用量を削減できます。大きなワークブックの場合は、セル データへのアクセス速度が犠牲になりますが、

PHPExcel はセルあたり平均 1,000 個のメモリを使用するため、大きなドキュメントではメモリが非常に早く消費されます。セル キャッシュ メカニズムを使用すると、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.6 公式ドキュメントは

setCacheStorageMethod( ) 成功した場合はブール値 true、成功した場合は false を返します。失敗した場合 (たとえば、APC が有効になっていないときに APC にキャッシュしようとした場合)、

setCacheStorageMethod() メソッドは、設定が成功したかどうかを示す BOOL 変数を返します (たとえば、APC が使用できない場合は、使用するように設定します)。 APC キャッシュは false を返します)

PHPExcel1.7.6 公式ドキュメントには、

個別のキャッシュが個々のワークシートごとに保持され、構成したキャッシュ方法と設定に基づいてワークシートがインスタンス化されるときに自動的に作成されます。ワークブックの読み取りを開始するか、最初のワークシートを作成したら、構成設定を変更します。

ワークシートがインスタンス化されると、設定または構成に従って自動的にキャッシュされます。ファイルの読み取りを開始するか、最初のワークシートを作成した後は、キャッシュ方法を変更することはできません。

PHPExcel1.7.6 公式ドキュメントには次のように書かれています

現在、次のキャッシュ メソッドが利用可能です:

PHP コード:

PHPExcel_CachedObjectStorageFactory::cache_in_memory; 7.6 公式ドキュメント

キャッシュ メソッドを初期化しない場合、これは現在と同様に PHPExcel が使用するメソッドです。メソッドの場合、これが PHPExcel が使用するメソッドになります。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 メモリ内に保持されるファイル内の位置へのインデックスです。これは、cache_in_memory メソッドよりも遅いですが、メモリ使用量を大幅に削減します。スクリプトが終了すると、一時ディスク ファイルは自動的に削除され、すべてのセルが .html に保存されます。一時ディスク ファイルに保存され、ファイル内の位置のみが PHP のメモリに保存されます。これはメモリ内キャッシュよりも遅くなりますが、メモリ使用量が大幅に削減される可能性があります。一時ディスク ファイルは、スクリプトが終了すると自動的に削除されます。

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

PHP コード:

PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

PHPExcel1.7.6 公式ドキュメントには、

cache_to_discISAM と同様に、cache_to_phpTemp を使用する場合、すべてのセルが php:/ に保持されます。 / temp I/O ストリーム。PHP メモリ内にその位置へのインデックスのみが保持されます。PHP では、php://memory ラッパーはデータをメモリに保存します。php://temp は同様に動作しますが、保存に一時ファイルを使用します。特定のメモリ制限に達したときのデータ。デフォルトは 1 MB ですが、cache_to_phpTemp の初期化時にこれを変更できます。

cache_to_discISAM と同様に、cache_to_phpTemp を使用する場合、すべてのセルは php://temp I/O ストリームに残ります。 、それらの位置のみが PHP のメモリに保存されます。 PHP の php://memory ラッパーも同様にデータをメモリに保存しますが、保存されたデータのサイズがメモリ制限を超えると、データは一時ファイルに保存されます。デフォルトのサイズは 1MB です。ただし、初期化中に変更できます:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

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

PHPExcel_Settings::setCacheS torageMethod( $ キャッシュメソッド, $cacheSettings);

PHPExcel1.7.6 公式ドキュメントには、

スクリプトが終了すると php://temp ファイルが自動的に削除されます。

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

PHP コード:

PHPExcel_CachedObjectStorageFactory::cache_to_apc;

PHPExcle1.7.6 公式ドキュメントには

cache_to_apc を使用すると、インデックスのみが維持された状態でセル オブジェクトが APC に維持されます。デフォルトでは、APC キャッシュ タイムアウトとして 600 秒が使用されますが、これはほとんどのアプリケーションでは十分です。ただし、cache_to_APC を使用する場合、これを変更することは可能です。 APC に保存され、インデックスのみがメモリに保存されます。デフォルトの APC キャッシュ タイムアウトは 600 秒で、ほとんどのアプリケーションには十分です。もちろん、初期化中に変更することもできます。 ( 'cacheTime' => 600 );

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

PHPExcel1.7.6 の公式ドキュメントには、スクリプトが終了すると、cacheTime 値に関係なく、すべてのエントリが APC からクリアされると書かれています。 , そのため、このメカニズムを使用した永続ストレージには使用できません。

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

PHP コード:



PHPExcel_CachedObjectStorageFactory::cache_to_memcache

PHPExcel1.7.6 公式ドキュメントの記述

cache_to_memcache を使用する場合、セル オブジェクトはインデックスのみで memcache に維持されます

デフォルトでは、PHPExcel はローカルホストのポート 11211 で memcache サーバーを検索します。また、別のサーバーまたはポートで memcache を実行している場合は、memcache のタイムアウト制限も 600 秒に設定されます。その後、cache_to_memcache を初期化するときにこれらのデフォルトを変更できます:

cache_to_memory を使用すると、セル オブジェクトは memcache に保存され、インデックスのみがメモリに保存されます。デフォルトでは、PHPExcel はローカルホストおよびポート 11211 で memcache サービスを検索します。タイムアウトは 600 秒です。他のサーバーまたは他のポートで memcache サービスを実行する場合は、初期化中に変更できます:

Php コード:

。 $cacheMethod = PHPExcel_CachedObjectStorageFactory ::cache_to_memcache;

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

'memcachePort' => 11211,

'cacheTime' => 600

);

PHPEx cel_Settings: :setCacheStorageMethod($cacheMethod , $cacheSettings);

初期化設定の観点から見ると、MS は複数の memcache サーバーのポーリング方法をまだサポートしていません。これは残念です。

PHPExcel1.7.6 公式ドキュメントには、

スクリプトが終了すると、cacheTime 値に関係なく、すべてのエントリが memcache からクリアされるため、このメカニズムを使用して永続ストレージとして使用することはできません

スクリプトが終了すると、すべてのエントリが削除されます。データは memcache からクリアされます (キャッシュ時間は無視されます)。このメカニズムは永続ストレージには使用できません。

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

PHP コード:

PHPExcel_CachedObjectStorageFactory::cache_to_wincache;

PHPExcel1.7.6 公式ドキュメントの記述

cache_to_wincache を使用すると、セル オブジェクトはインデックスのみを保持して Wincache に保持されますデフォルトでは、Wincache キャッシュ タイムアウトとして 600 秒が使用されますが、これはほとんどのアプリケーションでは十分です。ただし、cache_to_wincache の初期化時にこれを変更することも可能です。これは Wincache に保存され、インデックスのみがメモリに保存されます。デフォルトでは、Wincache の有効期限は 600 秒で、ほとんどのアプリケーションには十分です。もちろん、初期化中に変更することもできます。 :

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache;

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

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); PHPExcel 公式ドキュメント 1.7.6 の書き込み

スクリプトが終了すると、cacheTime 値に関係なく、すべてのエントリが Wincache からクリアされるため、このメカニズムを使用した永続ストレージとしては使用できません。

PHPExcel の最大の問題は、メモリ使用量です。軽量バージョンはありますか? 大規模バージョンにはそれほど多くの複雑な機能は必要ありません。最も一般的なデータ バージョンをエクスポートするだけで済みます。

上記の内容は、LZ がインターネットで見つけた比較的良い記事ですが、私の問題を完全に解決したわけではありませんが、メモとして使用したいと思います。子どもたちの靴になるほど!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。