Symfony应用中Dompdf内存问题的排查与验证方法
Dompdf 2.0.3循环生成PDF时内存耗尽问题排查
在Symfony 4.4.36应用中使用Dompdf 2.0.3生成PDF时遭遇内存耗尽错误,怀疑Dompdf存在内存泄漏。为此编写了循环生成PDF并监控内存的PHP脚本,运行后触发内存耗尽,需要确认问题根源是Dompdf本身还是其他底层问题(PHP版本为7.4.33)。
排查脚本
use Dompdf\Dompdf; ini_set('memory_limit', '20M'); print memory_get_usage() . PHP_EOL; for ($i = 0; $i < 1000; $i ++) { print memory_get_usage() . PHP_EOL; createPDF(); } print memory_get_usage() . PHP_EOL; function createPDF () { // 实例化并使用dompdf类 $dompdf = new Dompdf(); $dompdf->loadHtml('hello world'); // (可选)设置纸张尺寸和方向 $dompdf->setPaper('A4', 'landscape'); // 将HTML渲染为PDF $dompdf->render(); }
触发的错误
PHP Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 12288 bytes) in path/to/vendor/dompdf/dompdf/src/Css/Stylesheet.php on line 281
问题分析与验证步骤
- 内存未主动释放:脚本每次循环创建Dompdf实例,但未手动销毁或触发垃圾回收。PHP自动垃圾回收可能因循环内对象引用未及时清理,导致内存持续堆积。
- 验证方法:修改
createPDF函数,添加实例销毁和垃圾回收代码,观察内存变化:function createPDF () { $dompdf = new Dompdf(); $dompdf->loadHtml('hello world'); $dompdf->setPaper('A4', 'landscape'); $dompdf->render(); // 手动销毁实例并触发垃圾回收 unset($dompdf); gc_collect_cycles(); } - 泄漏判断依据:如果修改后内存仍持续线性增长(而非循环后回落),则大概率是Dompdf的内存泄漏问题。错误提示指向
Stylesheet.php,可能和样式解析的缓存未正确释放有关。 - 版本兼容性:Dompdf 2.0.3可能存在未修复的内存泄漏bug,尝试升级到同分支的最新稳定版本(如2.x后续版本),验证问题是否已解决。
- 内存限制合理性:20M内存限制本身偏低,但如果内存是持续增长而非稳定波动,仍需优先排查泄漏问题。
内容的提问来源于stack exchange,提问作者Unnikrishnan
相关产品推荐
相关产品推荐

