PHP+DomPDF 生成 PDF 速度慢
Slow PDF generation with PHP+DomPDF
我花了一段时间处理使用 DomPDF 的非常慢的 PDF 生成过程。经过大量摆弄和谷歌搜索后,我最终找到了一个解决方案,我想 post 以防你们中的一些人遇到同样的问题。
问题:
我管理的电子商务网站具有允许卖家下载他们已完成的采购订单的 PDF 文件的功能(基本上是向买家显示的购买确认副本)。这一直很有效。
当我部署了一项附加功能以允许卖家下载一个 单个 PDF 文件时,问题就开始了,其中包含在一组用户定义的日期之间生成的所有采购订单。当需要导出为单个 PDF(每页一个)的采购订单数量超过 20-30 时,过程变得极其缓慢(如 30-60 秒)。
从数据库中获取数据并解析它不是问题。构建稍后导出到 PDF 的视图也不是问题(即使是数百个订单,将 HTML 输出到屏幕也只需要几分之一秒),所以我基本上确定 dompdf 是问题所在.
设置如下:
1.- MySQL 数据库
2.- 应用服务器:多个负载均衡 PHP+Nginx+PHP-fpm 实例 运行 linux
3.- PHP 7.2
4.- dompdf 0.82(最新的)
5.- 代码点火器 3.0.9
6.- Bootstrap 用于格式化布局
目标是允许在可接受的时间内在单个 PDF 中下载多个(可能数百个)采购订单。
解决方案:
经过大量谷歌搜索、试验和错误,在 Whosebug 上查找了大量内容(none 我发现的文章非常有帮助),我发现 bootstrap 那是导致问题。
我正在使用 bootstrap 进行非常基本的布局管理,我意识到将整个库(甚至是缩小的库)链接到发送到 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>
和从视图中完全删除bootstrap。
重新测试,结果惊人:
一份 100 份采购订单(100 页)PDF(大小小于 60 kB)在更改之前需要 30-60 秒才能生成并流式传输给用户,现在生成时间不到一半 第二个 ,证实链接 bootstrap 会在 dompdf 上产生巨大的开销,这在 99% 的用例中可能是不必要的。
希望这对某人有所帮助。花了好几天的时间才弄明白。
我花了一段时间处理使用 DomPDF 的非常慢的 PDF 生成过程。经过大量摆弄和谷歌搜索后,我最终找到了一个解决方案,我想 post 以防你们中的一些人遇到同样的问题。
问题: 我管理的电子商务网站具有允许卖家下载他们已完成的采购订单的 PDF 文件的功能(基本上是向买家显示的购买确认副本)。这一直很有效。 当我部署了一项附加功能以允许卖家下载一个 单个 PDF 文件时,问题就开始了,其中包含在一组用户定义的日期之间生成的所有采购订单。当需要导出为单个 PDF(每页一个)的采购订单数量超过 20-30 时,过程变得极其缓慢(如 30-60 秒)。
从数据库中获取数据并解析它不是问题。构建稍后导出到 PDF 的视图也不是问题(即使是数百个订单,将 HTML 输出到屏幕也只需要几分之一秒),所以我基本上确定 dompdf 是问题所在.
设置如下: 1.- MySQL 数据库 2.- 应用服务器:多个负载均衡 PHP+Nginx+PHP-fpm 实例 运行 linux 3.- PHP 7.2 4.- dompdf 0.82(最新的) 5.- 代码点火器 3.0.9 6.- Bootstrap 用于格式化布局
目标是允许在可接受的时间内在单个 PDF 中下载多个(可能数百个)采购订单。
解决方案:
经过大量谷歌搜索、试验和错误,在 Whosebug 上查找了大量内容(none 我发现的文章非常有帮助),我发现 bootstrap 那是导致问题。
我正在使用 bootstrap 进行非常基本的布局管理,我意识到将整个库(甚至是缩小的库)链接到发送到 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>
和从视图中完全删除bootstrap。
重新测试,结果惊人: 一份 100 份采购订单(100 页)PDF(大小小于 60 kB)在更改之前需要 30-60 秒才能生成并流式传输给用户,现在生成时间不到一半 第二个 ,证实链接 bootstrap 会在 dompdf 上产生巨大的开销,这在 99% 的用例中可能是不必要的。
希望这对某人有所帮助。花了好几天的时间才弄明白。