我使用KnpSnappyBundle 1.6.0和wkhtmltopdf 0.12.5从PHP中的HTML生成PDF,如下所示:
$html = $this->renderView(
'pdf/template.html.twig',
[ 'entity' => $entity, ]
);
return new PdfResponse($snappy->getOutputFromHtml($html,
['encoding' => 'UTF-8', 'images' => true]), 'file'.$entity->getUniqueNumber().'.pdf'
);
我的问题:在生产服务器上,当我引用同一服务器上的资产(图像或CSS)时,生成PDF大约需要40-50秒。即使我只使用同一台服务器上的微小映像,也要花费40秒。我可以使用托管在另一台服务器上的更大图像,并且生成PDF会立即发生。
总体来说,我的服务器提供资产或文件的速度并不慢。如果我只是将HTML呈现为页面,则它会立即发生(无论有无资产)。当我从生产服务器本地请求资产以生成pdf时,它也会立即发生。
我需要在HTML中呈现为PDF的资产都具有绝对URL,这是wkhtmltopdf正常运行所必需的。例如:<img src="https://www.example.com/images/logo.png">
困难的是,一切正常,但运行非常缓慢。没有指向会导致超时的不存在资产的指示。
我首先认为可能与wkhtmltopdf有关,所以我尝试了不同的版本和不同的设置,但这并没有改变任何内容。我也试图指向同一台服务器上的另一个域,问题仍然存在。所以我现在的猜测是这是服务器问题。我正在运行Nginx-1.16.1并通过SSL提供所有内容。我已安装libssl-dev1.1.1d-1(最新的稳定版),并且我的操作系统是Ubuntu 18.04.3 LTS。
[当我查看Nginx访问日志时,可以看到使用同一服务器上的资产时,我自己的IP地址发出了一个get请求。我无法理解为什么要花这么长时间,而我已经不知道下一步该怎么做了。任何想法表示赞赏!
sudo apt-get install wkhtmltopdf
这将通过Ubuntu存储库安装
wkhtmltopdf 0.12.4(于2019年11月5日安装)。这是wkhtmltopdf的旧版本,单独运行它给我带来了许多问题。为了解决这个问题,我现在在然后将您使用的指向wkhtmltopdf的包装程序的二进制路径更改为:xvfb中运行它。首先通过运行安装它:
sudo apt-get install xvfp
'/usr/bin/xvfb-run /usr/bin/wkhtmltopdf'
在我的情况下,我使用
KnpSnappyBundle并在
.env
文件中设置二进制路径。在knp_snappy.yaml
中设置binary: '%env(WKHTMLTOPDF_PATH)%'
,在.env
中设置WKHTMLTOPDF_PATH='/usr/bin/xvfb-run /usr/bin/wkhtmltopdf'
(如上所述)。我现在可以按常规方式生成PDF。