mpdf只打印少于450条记录

时间:2014-05-27 09:04:28

标签: php zend-framework mpdf

我使用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;

4 个答案:

答案 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。