生成带有图像的PDF太慢了

时间:2014-09-16 01:45:19

标签: php performance cakephp pdf cakephp-2.5

我现在遇到的一大瓶颈是每次有人下订单时生成PDF。对于单个订单来说这不是什么大问题,但是如果在很短的时间内有很多,那么这个过程非常缓慢。

PDF需要文本信息,QR码,条形码,徽标以及1个或更多(最多20个)1/4宽度的图像。

当前流程w / DOMPDF:

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

    1. HTML2PDF创建PDF,并使用它的qr和条形码标签生成条形码
    2. 理论上它会照顾QR和条形码图像,但是,其余的图像使它太慢。

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


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

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


      问题/ TLDR:

      如何使用动态qr代码,动态条形码,动态文本和1-20静态图像(所有PDF中的图像相同)创建PDF的过程更快?

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

3 个答案:

答案 0 :(得分:4)

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

要进一步改善效果,请使用this页面的提示:

  • 安装和配置像XCache一样的PHP操作码cacher;
  • 编辑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生成。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

TCPDF图像也很慢