8

小さな xls テーブル (~25x15) を生成するスクリプトがあります。パーセンテージと文字列が含まれており、次のコードで現在のセルをパーセンテージ タイプとして設定する if 演算子があります。

$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%');

しかし、ファイルをエクスポートして見ると、タイプとスタイルを約 20 セルしか設定できなかったことがわかります。そして、残りはすべてデフォルト設定です。私はそれをデバッグし、問題が私のロジックにないことに気付きました。PHPキャッシュメモリの増加について読みました-試してみましたが、機能しませんでした。少なくとも 15 倍のテーブルをエクスポートする必要があるため、助けてください。前もって感謝します!

4

3 に答える 3

3

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 データ ファイルのエクスポートに切り替える必要がありました。

于 2013-08-11T15:27:44.960 に答える
2

コードをローカルで実行したところ、このパーセンテージに設定した 26 個のセルすべてが正しい形式と % 記号を持っていることがわかりました。もちろん、最初に 136 ~ 137 行のコメントを解除する必要がありました。

これは、セットアップに関連している必要があります。このサイズのスプレッドシートに対してメモリが少なすぎるとは想像できません。

参考までに、PHP バージョン 5.4.16、php Excel バージョン 1.7.6、2011-02-27 で動作することを確認しました。MS Excel 2007 でスプレッドシートを開きました。

于 2013-08-12T15:58:10.957 に答える
1
<?php
$file = 'output_log.txt';

function get_owner($file)
{
    $stat = stat($file);
    $user = posix_getpwuid($stat['uid']);
    return $user['name'];
}

$format = "UID @ %s: %s\n";

printf($format, date('r'), get_owner($file));

chown($file, 'ross');
printf($format, date('r'), get_owner($file));

clearstatcache();
printf($format, date('r'), get_owner($file));
?>

clearstatcache(); 役に立ちます。この関数を php ページの最初にロードします。

于 2013-08-05T05:23:32.657 に答える