12

我目前遇到的一个大瓶颈是每次有人下订单时生成 PDF。单单没什么大不了的,但是在短时间内有很多的时候,这个过程就很慢了。

PDF 需要文本信息、二维码、条形码、徽标和 1 个或更多(最多 20+)1/4 宽的图像。

带有 DOMPDF 的当前流程:

  1. 使用 PHP 创建并保存为 png 的 QR 码图像
  2. 创建并保存为 png 的条码图像
  3. DomPDF 生成 PDF

新思路:

  1. HTML2PDF 创建 PDF,并使用它的 qr 和条形码标签生成条形码

从理论上讲,这将处理 QR 和条形码图像,但仍然,其余图像使其太慢。

这样做,除了(QR 和条形码)之外没有任何图像,PDF 可以在大约 500 毫秒内生成,但是一旦我开始添加图像,它就会上升到 2、3、4、5+ 秒。


在运行测试并处理大约 10k 个订单(在几分钟内)时,大约 12 小时后它仍在处理 PDF,直到我沮丧地关闭它。

PDF 是在一个单独的队列过程中生成的,因此该人在订购时不必等待,但是 - 仍然......他们不会需要 5 多个小时才能在高流量期间收到他们的确认 PDF。


问题/ TLDR:

如何更快地创建包含动态二维码、动态条形码、动态文本和 1-20 个静态图像(所有 PDF 中的图像相同)的 PDF 的过程?

还有其他我没有想到的潜在事情吗?也许制作一个模板 PDF 并以某种方式使用 PHP 来填充动态点?

4

3 回答 3

5

我强烈建议您使用 TCPDF 库。它非常快并且可以很容易地集成到 CakePHP 中。您可以在 TCPDF 示例页面找到很多如何将图像、条形码和 QR 码包含到 PDF 中的示例。

要进一步提高性能,请使用页面中的提示:

  • 安装和配置像 XCache 这样的 PHP 操作码缓存器;
  • 编辑 php.ini 文件并增加脚本可能消耗的最大内存量(memory_limit);
  • 编辑php.ini文件,增加每个脚本的最大执行时间(max_execution_time);
  • 编辑config/tcpdf_config.php文件:手动设置$_SERVER['DOCUMENT_ROOT']、K_PATH_MAIN和K_PATH_URL常量,去掉自动计算部分;
  • 如果您不使用泰语,请编辑 config/tcpdf_config.php 文件并将 K_THAI_TOPCHARS 常量设置为 false;
  • 如果不需要扩展字符,编辑 config/tcpdf_config.php 文件并将默认字体设置为核心字体;
  • 如果您不需要 UTF-8 Unicode,请将 TCPDF 构造函数上的 $unicode 参数设置为 false 并将 $encoding 参数设置为 'ISO-8859-1' 或其他字符映射。
  • 默认情况下,TCPDF 启用字体子集以减小嵌入的 Unicode TTF 字体的大小,这个过程非常慢并且需要大量内存,可以使用 setFontSubsetting(false) 方法关闭;
  • 尽可能使用核心字体而不是嵌入字体;
  • 如果没有严格要求,请避免使用 HTML 语法(writeHTML 和 writeHTMLCell 方法);
  • 将大的 HTML 块分割成小块;
  • 如果没有严格要求,请避免使用事务;
  • 更改后重新启动网络服务器。

如果这不能将性能提高到可接受的水平,您可以在具有更多可用资源的第二台服务器上安装您的 CakePHP 应用程序(或者只是运行生成 PDF 的脚本,如果它不使用 CakePHP)并仅将该服务器用于PDF 生成。

于 2014-09-16T21:19:55.437 回答
4

如果您不需要透明度,可以尝试使用 JPEG 而不是 PNG 文件。

例如,在 TCPDF 中,我必须生成背景为大 PNG(18cm x 18cm,300dpi)的 PDF。在生成文件之前,我必须等待 11 秒。我用相同大小和 DPI 的 JPEG 替换图像,用时不到 1 秒。

于 2018-06-04T14:56:48.727 回答
0

图像的 TCPDF 也很慢

于 2017-02-11T06:31:43.073 回答