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


PHP proc_open & exec timeout but cli works fine

我目前正在使用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与进程组件,它进入一个超时…当使用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,过程可以完成,但仍然挂起与这个错误的报告?当我有更多的信息时,我会更新,看看PDF是否确实生成了。

谢谢。

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

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