大量のデータをエクスポートするときの PHPExcel のタイムアウトとメモリ エラーの解決策
PHP の Excel へのエクスポートは、phpexcel クラスを使用すると非常に便利ですが、大きなデータをエクスポートする場合はそれほど単純ではありません。多くの場合、タイムアウトやメモリ オーバーフローが発生することがあります。ここでは、一緒に学び、一緒に進歩するいくつかの方法を紹介します。 。 。
PHPExcel は、Excel を処理するための非常に強力な PHP オープン ソース クラスですが、メモリを大量に消費するという大きな問題があります。1.7.3 以降、セル キャッシュ メソッドの設定をサポートしていますが、これをお勧めします。現在の安定バージョン 1.7.6 を使用します。以前のバージョンにはさまざまな程度のバグがあるため、以下はその公式ドキュメントです:
PHPExcel1.7.6 公式ドキュメントには、
PHPExcel は平均を使用します。ワークシート内のセルあたり約 1k なので、大きなワークブックでは使用可能なメモリがすぐに使い果たされる可能性があります。 セル キャッシュは、PHPExcel がセル オブジェクトをより小さいサイズのメモリ、ディスク上、または APC、memcache、または Wincache に保持できるようにするメカニズムを提供します。これにより、セル データへのアクセス速度が犠牲になりますが、大きなワークブックのメモリ使用量を削減できます。
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.6 公式ドキュメントの書き込みDao
setCacheStorageMethod() は、成功した場合はブール値 true、失敗した場合は false を返します (たとえば、APC が有効になっていないときに APC にキャッシュしようとした場合)。
setCacheStorageMethod() は BOOL を返します。 type変数は設定が成功したかどうかを示すために使用されます(例えば、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 メモリに保持されます。これは、どのcache_in_memory メソッドよりも低速ですが、メモリ フットプリントが大幅に削減されます。一時ディスク ファイルは、スクリプトが終了すると自動的に削除されます。
cache_to_discISAM を使用すると、すべてのセルが一時ディスク ファイルに保存され、ファイル内のセルの位置のみが 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 です。ただし、初期化中に変更できます:
Php コード:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_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 を使用する場合、セル オブジェクトは APC に保持され、セルが存在することを識別するためにインデックスのみが PHP メモリに保持されます。デフォルトでは、600 秒の APC キャッシュ タイムアウトが使用されます。これは、ほとんどのアプリケーションでは十分です。 :ただし、cache_to_APC の初期化時にこれを変更することは可能です。
cache_to_apc を使用すると、セルは APC に保存され、インデックスのみがメモリに保存されます。デフォルトの APC キャッシュ タイムアウトは 600 秒で、ほとんどのアプリケーションには十分です。 もちろん、初期化中に変更することもできます:
Php コード:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_APC;
$cacheSettings = array( 'cacheTime' => 600 );
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
PHPExcel1 .7.6 公式ドキュメントには次のように書かれています
スクリプトが終了すると、cacheTime 値に関係なく、すべてのエントリが APC からクリアされるため、このメカニズムを使用して永続ストレージとして使用することはできません。
の実行が終了すると、すべてのデータが APC からクリアされ (キャッシュ時間は無視されます)、このメカニズムは永続的なキャッシュとして使用できません。
=========================================== == ===============
PHP コード:
PHPExcel_CachedObjectStorageFactory::cache_to_memcache
PHPExcel1。 7.6 公式 ドキュメントには次のように書かれています
cache_to_memcache を使用すると、セル オブジェクトは memcache に維持され、セルが存在することを識別するためにインデックスのみが PHP メモリに維持されます。
デフォルトでは、PHPExcel は memcache を探します。また、別のサーバーまたはポートで memcache を実行している場合は、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
);
PHPExcel_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 で維持され、セルが存在することを識別するためにインデックスのみが PHP メモリに維持されます。デフォルトでは、600 秒の Wincache キャッシュ タイムアウトが使用されます。これは、ほとんどのアプリケーションでは十分です。 :ただし、cache_to_wincache の初期化時にこれを変更することは可能です。
cache_towincache メソッドを使用すると、セル オブジェクトは Wincache に保存され、インデックスのみがメモリに保存されます。デフォルトでは、Wincache の有効期限は次のとおりです。 600 秒 (これは絶対的な長さです) ほとんどのアプリケーションでは十分であり、もちろん初期化中に変更できます:
Php code:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache;
$cacheSettings = array( 'cacheTime ' => 600 );
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
PHPExcel 公式ドキュメント 1.7.6 が書きました
スクリプトが終了すると、cacheTime 値に関係なく、すべてのエントリが Wincache からクリアされるため、このメカニズムを使用して永続ストレージとして使用することはできません。
PHPExcel は依然として比較的強力です。最大の問題は、メモリ使用量。PHPExcel はいつになったら、多くの高度な機能を必要とせず、最も一般的なデータ バージョンをエクスポートするだけで済む軽量バージョンを作成できるようになります。
上記の内容は、LZ がインターネットで見つけた比較的良い記事であり、私の問題を完全に解決したわけではありませんが、よく書かれていると感じたので、メモとして取り上げたいと思います。私が見た子供たちの靴に役立つかもしれません!