我在处理许多不同的生成文件类型时遇到了这个问题,而不仅仅是 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.';
}
因为生成文件需要一段时间,所以回声一个接一个地出现,让用户可以看到一些东西,所以他们不会认为屏幕已经冻结。最终的回显链接只会在文件生成后出现,这意味着用户会自动等待文件准备好才能下载。您可能必须延长此脚本的最大执行时间。