PHPExcelはかなりのメモリを割り当てます
PHPExcel は美しいライブラリですが、それを使用すると、PHP に割り当てられた大量のメモリが必要になる場合があります。
このスレッドによると、わずか5 つのセルで 6 MBのメモリ使用量がレンダリングされる可能性があります。
<?php
require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx");
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('D2', 50);
echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . "
";
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\r\n";
?>
I get 6MB of memory usage.
別のユーザーは、256MByte のメモリ設定でさえ失敗しました。
PHPExcel はメモリ フットプリントを削減する方法を提供していますが、私の場合、すべての削減は小さすぎることが判明しました。github のこのページは、PHPExcel のキャッシュ管理オプションの詳細を提供します。たとえば、この設定は、ワークシートのセル構造をシリアル化し、GZIP します。
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
PHPExcel の FAQでは、次のように説明されています。
致命的なエラー: 行 aaa の zzz で許容メモリ サイズの xxx バイトが使い果たされました (yyy バイトを割り当てようとしました)
PHPExcel は、スプレッドシートの「メモリ内」表現を保持するため、PHP のメモリ制限の影響を受けやすくなります。PHP で使用できるメモリは、php.ini ファイルの memorylimit ディレクティブの値を編集するか、コード内で iniset('memory_limit', '128M') を使用することで増やすことができます (ISP が許可する場合)。
一部のリーダーとライターは他のものよりも高速であり、メモリの使用量も異なります。PHPExcel のさまざまなバージョンでの、さまざまなリーダーとライターの相対的なパフォーマンスとメモリ使用量の指標を見つけることができます
。
すでにメモリを最大まで増やした場合、またはメモリ制限を変更できない場合は、ボード上のこのディスカッションで、PHPExcel http://phpexcelを使用してスクリプトのメモリ使用量を削減するために適用できるいくつかの方法について説明しています
。 .codeplex.com/Thread/View.aspx?ThreadId=242712
PHP Excelの測定結果
PHPExcel サンプル ファイルを計測し、[01simple.php][5]
簡単なテストを行いました。
92キロバイトを消費:
for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
}
4164 キロバイトを消費します:
for( $n=0; $n<200; $n++ ) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);
}
このフラグメントを変更せずに数回実行すると、各フラグメントは約 4 MB を消費します。
アプリが論理的に正しいことを確認する
アプリが論理的に正しいことを確認するために、最初に PHP メモリを増やすことをお勧めします。
ini_set('memory_limit', '32M');
私の場合、オンライン評価アプリケーションの結果データをエクスポートするには、エクスポートする必要があります。水平方向のセルは 100 未満ですが、最大数 10.000 行をエクスポートする必要があります。セルの量は多かったのですが、各セルには数値または 3 文字の文字列が保持されています。式もスタイルもありません。
強力なメモリ制限または大きなスプレッドシートの場合
私の場合、どのキャッシュ オプションも、必要なほど量を減らしませんでした。さらに、アプリケーションの実行時間は大幅に増加しました。
最後に、昔ながらの CSV データ ファイルのエクスポートに切り替える必要がありました。