用PHP + DomPDF缓慢生成PDF

时间:2019-02-19 14:18:32

标签: php twitter-bootstrap dompdf

我花了一段时间处理使用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.- Codeigniter 3.0.9 6.-用于格式化布局的Bootstrap

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

1 个答案:

答案 0 :(得分:1)

解决方案:

经过大量的搜索,反复试验,大量研究了Stackoverflow(我发现没有一篇文章真正有帮助),我才发现是导致问题的原因是引导程序。

我使用引导程序进行基本的布局管理,我意识到将整个库(甚至是缩小的库)链接到发送给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%的用例中可能是不必要的。

希望这对某人有帮助。花了几天的时间才弄清楚。