我使用mpdf生成pdf但mpdf仅在记录小于450时才有效。如果记录超过450则我收到错误
Out of memory (allocated 1792802816) (tried to allocate 261904 bytes) in C:\..\mpdf\classes\cssmgr.php on line 17742
请为我提供更好的解决方案。我的代码在这里
ini_set('max_execution_time',360000);
set_time_limit(360000) ;
ignore_user_abort(true) ;
foreach($violations1 as $val)
{
$exportpdf .= '<tr>';
$exportpdf .= '<td width="100" >'.$val['street_number'].'</td>';
$exportpdf .= '<td width="120" >'.$val['street_name'].'</td>';
$exportpdf .= '<td width="155" >'.$val['city'].'</td>';
$exportpdf .= '<td width="175" >'.$val['zip'].'</td>';
$exportpdf .= '<td width="160" >'.$val['country'].'</td>';
$exportpdf .= '</tr>';
}
$exportpdf .= '</table>';
$exportpdf = preg_replace('/>\s+</', "><", $exportpdf);
include("mpdf/mpdf.php");
$mpdf=new mPDF('c','A4-L','','',32,25,34,18,16,13);
$mpdf->SetDisplayMode('fullpage');
$mpdf->list_indent_first_level = 0;
$stylesheet = file_get_contents('mpdf/mpdf.css');
$mpdf->WriteHTML($stylesheet,1);
$mpdf->setFooter('Page {PAGENO}') ;
$mpdf->WriteHTML('<html><body>'.$exportpdf.'</body></html>');
$mpdf->Output('rec.pdf','D');
exit;
答案 0 :(得分:5)
$mpdf->cacheTables = true;
$mpdf->simpleTables=true;
$mpdf->packTableData=true;
它为我工作至少5000条记录
答案 1 :(得分:1)
您必须增加php.ini中的memory_limit
答案 2 :(得分:1)
在mpdf上,您可以选择禁用&#34;漂亮的桌面边框&#34;,这一功能会大大增加内存使用量。
$mpdf->simpleTables = true;
然而,我发现有时这还不够。在这种情况下我做的是,一旦我将所有html分配给变量,然后我设置为false / null我不再需要的任何其他变量。例如,在这种情况下,你有一个数据数组$ violation1但是在构建html并将其分配给$ exportpdf之后,$ violation1变量变得非常无用。
还有另一种选择:
$mpdf->packTableData = true;
我已经尝试过,但收效甚微。如果你有一个SQL数据对象/数组太大(特别是使用ORM和大量记录)或者如果你使用Smarty来渲染ui,那么在构建html之后更好地刷新这些大变量。
当然,在系统中拥有更多内存是一件好事。但是如果你不能将ini_set('memory_limit','256M')
添加到系统中,那么使用这个小的mpdf hacks可以完成这项工作。
答案 3 :(得分:0)
只要添加我的故事,以防其他人相信此结果(PHP 7.2.10
)。当我开始为我正在研究的项目运行一些负载测试时,我遇到了相同的情况。
就我而言,在耗尽128 MB
内存之前,我无法生成超过51个PDF。
我能够通过在每次迭代后使用gc_collect_cycles()
显式调用PHP的GC来解决此问题,而对性能没有明显影响:
在将调用添加到上述函数之后,该脚本在我决定停止之前已经愉快地生成了2000多个PDF。
我接下来要做的是不每次迭代都调用gc_collect_cycles()
,而是获取一些有关运行时内存使用情况的数字,并触发与之相关的GC。
同时,您应确保代码不会泄漏,因为在这种情况下,您将不处理原因,而只是掩盖后果。
增加内存仅应作为最后的选择,我认为这可能无法解决问题,而只能使您在耗尽资源之前生成更多PDF。