私は、PHP を介してデータベース情報をエクスポートする Web ベースのアプリケーションに取り組んできました。アプリケーションの元のバージョンでは、最初に単一の OpenXML ワークシートが生成されましたが、特定の行数 (約 9500) を超えると、生成されたワークシートが大きすぎて Excel または OpenOffice にインポートできないという問題が発生しました。
その後、libxl 用の php_excel ラッパーを使用するようにアプリを作り直しました。これは、テストでは適切に機能しましたが、ライブ サーバー (テスト サーバーと比較して大量のデータがあった) に展開すると、プロセスのメモリ使用量が増加しました。 2GB を少し下回っただけで失敗し、次のエラーが発生します。
Call to a member function write() on a non-object in...etc etc.
ここで興味深いのは、このコードは小さなデータ セットに対して機能することです。要求するデータの量を制限すると、データベースから部分的なデータ ダンプを収集できます。すべての調査から、コードが割り当てられていないオブジェクトを参照しようとすると、このエラーが発生します。以下にコードを示します。
$objPHPExcel = new ExcelBook($rcn, $rcl, true);
for ($i=0;$i<$myCCount;$i++){
$myPCount = count($mySelection[$i])
for ($j=1;$j<$myPCount;$j++){
$myWorkSheet = $myAccountSelection[$i][0] . ' - ' . $myAccountSelection[$i][$j];
$thisSheet = $objPHPExcel->addSheet($myWorkSheet);
for ($k=0;$k<count($myQueryArray);$k++){
$thisSheet->write(0, $k, $titleList[$myQueryArray[$k]]); //Error on this line
}
//The rest is database queries and spreadsheet generation.
繰り返しますが、これは小さなデータ セット (行数が同じで列数が少ない、または列数が同じで行数が少ない) で機能し、エラーになるまで約 15 分間実行されることを繰り返したいと思います。
要件によると、完全なデータ ダンプでは最大 924 個のワークブック (実際のエントリがないワークブックを除く) が生成され、各ワークブックには最大 360 列が含まれ、合計で 10,000 行以上が含まれます。
この場合、実際に問題が何であるかを特定するのを手伝ってくれる人はいますか?
編集の更新: php_excel ラッパーのエラー処理 (そのようなもの) をログに記録して掘り下げた後、問題は実際にラッパー自体の中でメモリ割り当て制限に達していると判断しました。PHP、FastCGI、またはマシンの残りの部分で使用できる空きメモリの量は、この場合は問題ではありません。これは、一定の量に達すると (私は現在、制限が何であるかを正確に突き止めようとしているところです)。 )。phpexcel ラッパーが処理できるセルの量を改善する方法について誰かが私を教育できない限り、これは「解決できないが既知の問題」として閉じられていると思います。