KnpSnappyBundle与Symfony 3.4:引入图片或CSS导致超时求助
解决KnpSnappyBundle生成PDF超时(含本地资源时)的问题
我之前也碰到过一模一样的情况,尤其是在本地环境用Symfony内置服务器的时候,给你几个实用的解决思路:
用本地文件路径替代HTTP URL加载资源
wkhtmltopdf是独立运行的进程,访问localhost开头的HTTP资源时很容易出问题(比如Symfony内置服务器是单线程的,会形成请求死锁)。直接用file://协议加载本地文件,跳过HTTP请求环节,速度会快很多:- 图片示例:
<img src="{{ 'file://' ~ app.root ~ '/web/images/your-image.jpg' }}" /> - CSS示例:
<link rel="stylesheet" href="{{ 'file://' ~ app.root ~ '/web/css/bootstrap.css' }}">
这里的app.root是Symfony自带的根目录参数,能帮你拼接出正确的绝对文件路径。
- 图片示例:
调整超时时间设置
如果必须用HTTP URL加载资源,那就先把超时时间拉长,给wkhtmltopdf足够的处理时间:- 修改
app/config/config.yml里的KnpSnappy配置:knp_snappy: pdf: enabled: true binary: "%wkhtmltopdf_binary%" options: timeout: 120 # 把默认60秒改成120秒,按需调整 - 同时要确保PHP的执行时间足够,在生成PDF的控制器方法里临时设置:
set_time_limit(120); // 临时将PHP执行时间改为120秒
- 修改
更换本地服务器环境
要是你用的是Symfony 3.4自带的server:run内置服务器,它是单线程的——当Symfony应用调用wkhtmltopdf,而wkhtmltopdf又请求本地服务器的资源时,两个请求会互相阻塞,直接导致超时。解决办法:- 换成多线程的本地服务器,比如Nginx+PHP-FPM;
- 或者把静态资源(图片、CSS)放到不需要经过Symfony处理的目录,直接用文件路径加载。
优化wkhtmltopdf运行参数
可以给wkhtmltopdf加几个参数减少加载压力:- 加上
--disable-external-links避免意外加载外部资源; - 检查你的wkhtmltopdf版本,旧版本可能对Bootstrap的CSS支持不佳,升级到稳定版试试。
- 加上
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

