You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:12:18