我目前正在使用Symfony Process组件,它依赖于PHP的proc_open
函数。我需要启动一个命令到wkhtmltopdf
,它的形式是:
/usr/local/bin/wkhtmltopdf --window-status "___RENDER_PDF___" --orientation "portrait" --run-script "window.basilOptions = {storages: ['memory'] }; document.body.addEventListener('status:app:rendered', function () { window.status = '___RENDER_PDF___'; });" "http://localhost/p/lps#poll/lpsp002" "/tmp/pdf_d6fbWO"`
当我在shell上直接运行这个命令时,它工作得很好,大约需要6秒才能执行。但当我使用PHP与进程组件,它进入一个超时…当使用exec
或proc_open
函数时,它无限期地运行。Process Component的默认超时是60秒(即使延长它也没有任何影响)。
我在PHP 5.4和PHP 5.5上尝试了这个,但结果似乎是相同的。
你知道为什么这个命令在shell上运行得很好,但在PHP中却不行吗?在MAMP和非MAMP环境上进行了测试(在5.4和5.5版本上)。它可以在Ubuntu 14.04和PHP 5.5上运行。
我想,也许,当通过PHP和MAMP,过程可以完成,但仍然挂起与这个错误的报告?当我有更多的信息时,我会更新,看看PDF是否确实生成了。
谢谢。
这个问题可能是由会话锁定引起的-当前PHP页面线程锁定会话以进行写入,因此同一服务器上的另一个页面等待会话被解锁(在sessions_start()
函数上)以处理请求(转储为PDF)。这将创建死锁,因为会话在默认情况下以其他线程的写锁开始。
为了防止此会话死锁,在命令前添加session_write_close();
关闭会话,如果您需要在PDF呈现后再次写入会话,则在PDF呈现后添加session_start();