PDFだけでなく、生成されたさまざまなファイルタイプでこの問題が発生しました。問題は変数のサイズにあり、プロセスがどれほど新鮮であっても、変数は依然として大きすぎるため、生成プロセスは役に立ちませんでした。私の解決策は、変数が特定のサイズを超えないように、ファイルを作成して管理可能なチャンクで書き込むことでした。
基本的な、テストされていない例:
$tmp = fopen($tmpfilepath, 'w');
if(is_resource($tmp)) {
echo 'Generating file ... ';
$dompdf = new DOMPDF();
$counter = 0;
$html = '';
while($line = getLineOfYourHtml()) {
$html .= $line;
$counter++;
if($counter%200 == 0) { //pick a good chunk number here
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
fwrite($tmp, $output);
echo round($counter/getTotalLines()).'%... '; //echo percent complete
$html = '';
}
}
if($html != '') { //the last chunk
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
fwrite($tmp, $output);
}
fclose($tmp);
if(file_exists($tmpfilepath)) {
echo '100%. Generation complete. ';
echo '<a href="'.$tmpfileURL.'">Download</a>';
} else {
echo ' Generation failed.';
}
} else {
echo 'Could not generate file.';
}
ファイルの生成には時間がかかるため、エコーが次々と表示され、画面がフリーズしたとは思わないようにユーザーに何かを見てもらうことができます。最終的にエコーされたリンクは、ファイルが生成された後にのみ表示されます。つまり、ユーザーはファイルをダウンロードする前に、ファイルの準備ができるまで自動的に待機します。このスクリプトの最大実行時間を延長する必要がある場合があります。