PHP proc_open& exec超时,但cli工作正常

时间:2014-07-21 14:05:03

标签: php symfony wkhtmltopdf proc-open symfony-process

我目前正在使用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与Process Component一起使用时,它会进入超时状态......当使用execproc_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时,这个过程可以完成但仍然像this bug报告的那样挂起?我会在获得更多信息时更新,以确定是否确实生成了PDF。

感谢。

1 个答案:

答案 0 :(得分:2)

问题可能是由会话锁定引起的 - 当前PHP页面线程锁定会话用于写入,因此同一服务器上的另一个页面等待会话解锁(在sessions_start()函数上)以处理请求(转储到PDF中) )。这会创建死锁,因为默认情况下会话以其他线程的写锁定开始。

要防止此会话死锁,请在命令之前添加session_write_close();来关闭写入会话,如果需要在PDF呈现后再次写入会话,请在PDF呈现后添加session_start();