CodeIgniter 4使用DOMPDF渲染PDF时出现内存耗尽错误
问题:CodeIgniter 4中DOMPDF嵌入图片时内存耗尽且页面无响应
在本地CodeIgniter 4环境使用DOMPDF生成PDF时,仅嵌入图片就触发内存耗尽错误:
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 262148096 bytes)
尝试增大内存限制后页面持续加载无响应,相关代码如下:
$dompdf = new \Dompdf\Dompdf(); $image=file_get_contents(ROOTPATH."/public/img/ss_logo_bgwhite.png"); $imagedata=base64_encode($image); $imgpath = '<img src="data:image/png;base64, '.$imagedata.'">'; $HTML='<body><div>'.$imgpath.'</div></body>'; $document_title = "Quote#$quoteId"; $options = $dompdf->getOptions(); $options->setDefaultFont('Helvetica'); $options->set('dpi','120'); $options->set('isRemoteEnabled', TRUE); // $options->set('isPhpEnabled ', true); $options->set('isHtml5ParserEnabled',true); $options->set('tempDir', ROOTPATH.'/public/uploads/'); $dompdf->setOptions($options); $dompdf->loadHtml($HTML); $dompdf->setPaper('A4', 'landscape'); $dompdf->render(); $dompdf->stream($document_title, ["compress" => 1, "Attachment" => false]);
解决方案参考
- 放弃base64嵌入,改用本地文件路径
base64编码会让图片体积膨胀约30%,大幅增加DOMPDF的内存消耗。直接引用本地文件路径即可,示例修改:
// 直接使用本地绝对路径 $imgPath = ROOTPATH . 'public/img/ss_logo_bgwhite.png'; $imgHtml = '<img src="' . htmlspecialchars($imgPath) . '" alt="Logo">';
同时确保DOMPDF的isRemoteEnabled已开启,临时目录有读写权限。
优化图片尺寸与质量
检查原始PNG图片的分辨率,如果是超大尺寸(比如几千像素),先压缩到PDF显示所需的实际大小(比如A4页面内的尺寸),用图片压缩工具减小文件体积,从根源降低内存占用。降低DOMPDF的DPI设置
当前设置的120dpi对于PDF来说过高,PDF标准dpi为72,修改后可减少渲染内存消耗:
$options->set('dpi','72');
- 合理设置内存限制
不要盲目调大全局内存,而是在PDF生成代码前临时设置:
// 临时提升内存限制,生成后自动恢复 ini_set('memory_limit', '1G');
同时检查php.ini中的max_execution_time,确保有足够的执行时间,但如果还是无响应,优先排查图片处理方式而非内存。
- 检查版本兼容性
DOMPDF 2.0.0与PHP 8.0.x存在已知兼容问题,建议升级DOMPDF到最新稳定版,或调整PHP版本至8.1及以上。
内容的提问来源于stack exchange,提问作者bStaq
相关产品推荐
相关产品推荐

