使用 PHP+DomPDF 生成缓慢的 PDF

Posted

技术标签:

【中文标题】使用 PHP+DomPDF 生成缓慢的 PDF【英文标题】:Slow PDF generation with PHP+DomPDF 【发布时间】:2022-01-03 12:41:38 【问题描述】:

我花了一些时间来处理使用 DomPDF 生成非常慢的 PDF 过程。经过大量的摆弄和谷歌搜索,我最终得到了一个解决方案,我想我会发布它,以防你们中的一些人正在处理同样的问题。

问题: 我管理的一个电子商务网站具有允许卖家下载包含他们已完成的采购订单的 PDF 文件的功能(基本上是向买家显示的购买确认的副本)。这一直工作正常。 当我部署了一个附加功能以允许卖家下载一个单个 PDF 文件时,问题就开始了,其中包含在用户定义的一组日期之间生成的所有采购订单。当需要导出为单个 PDF(每页一个)的采购订单数量超过 20-30 时,该过程变得极其缓慢(如 30-60 秒)。

从数据库中获取数据并对其进行解析不是问题。构建后来导出为 PDF 的视图也不是问题(即使对于数百个订单,将 html 输出到屏幕也只需要几分之一秒),所以我基本上确定 dompdf 是问题所在。

设置如下: 1.- mysql 数据库 2.- 应用服务器:运行linux的多个负载均衡的php+nginx+PHP-fpm实例 3.- PHP 7.2 4.- dompdf 0.82(最新的) 5.- 代码点火器 3.0.9 6.- 格式化布局的引导程序

目标是允许在可接受的时间内在一个 PDF 中下载多个(可能数百个)采购订单。

【问题讨论】:

【参考方案1】:

解决方案:

经过大量谷歌搜索、反复试验、在 *** 上查找了很多内容(我发现的文章都没有真正有用),我发现是引导程序导致了问题。

我使用引导程序进行非常基本的布局管理,我意识到将整个库(甚至是缩小的库)链接到发送到 dompdf 的视图中是多余的,但我不想重新编写视图文件.

所以,我采取了不同的方法: 获取我的视图正在使用的特定类(6 个,也许是 7 个)的 CSS 定义,并将它们内联到视图中的 <style> 标记中

<style>
.row 
  margin-right: -15px;
  margin-left: -15px;

.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 
  position: relative;
  min-height: 1px;
  padding-right: 15px;
  padding-left: 15px;


.col-lg-12 
    width: 100%;


.text-center 
  text-align: center;


body 
  font-family: Helvetica, Arial, sans-serif;
  font-size: 12px;
  line-height: 1.42857143;
  color: #333;
  background-color: #fff;

(...) the list goes on a little longer for some other bootstrap styles and other site-specific ones made by yours truly.
</style>

从视图中完全移除引导程序

重新测试,结果令人惊讶: 100 个采购订单(100 页)PDF(大小小于 60 kB)在更改前需要 30-60 秒生成并流式传输给用户,现在生成不到半秒 ,这证实了链接引导程序会在 dompdf 上产生巨大的开销,这在 99% 的用例中可能是不必要的。

希望这对某人有所帮助。花了好几天的时间才弄明白。

【讨论】:

我有一个类似的问题,如果你在库中挖掘,你会注意到一些 preg_replace 它基本上用内联样式替换所有类,并且当你声明了分配 css 类时它可能会非常慢(用blackfire.io) 这正是问题所在。当 CSS 文件很小时,它可能不是很明显,但是 bootstrap(作为一个 150kb 的怪物)让 dompdf 屈服了。 如何自动找到我在页面中使用的所有 CSS 定义? 谢谢!我从 10 多秒到只生成一个 3 页的 PDF,缩短到 1.5 秒。

以上是关于使用 PHP+DomPDF 生成缓慢的 PDF的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用 DOMPDF 在 PDF 页面中的标题

无法使用 DOMPDF 下载 pdf

如何使用barryvdh / dompdf在上传的PDF中添加标题

Laravel Dompdf 生成 pdf 错误

PHP:使用 DOMPDF 自动将动态 PDF 保存到远程服务器

在 dompdf 的 newtab 上生成 pdf