1

我目前使用的是 Symfony Process 组件,它依赖于proc_openPHP 的功能。我需要启动一个命令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 一起使用时,它会超时……而当使用execorproc_open函数时,它会无限期地运行。Process Component 的默认超时时间是 60 秒(即使延长它也没有任何效果)。

我在 PHP 5.4 和 PHP 5.5 上试过这个,但结果似乎是一样的。

任何想法为什么这个命令在 shell 上运行得很好但不能通过 PHP 运行?在 MAMP 而不是 MAMP 环境中测试(在 5.4 和 5.5 版本上)。它可以在带有 PHP 5.5 的 Ubuntu 14.04 上运行。

我想也许,当通过 PHP 和 MAMP 时,这个过程可以完成,但仍然像这个 bug所报告的那样挂起?当我有更多信息时,我会更新,看看是否确实生成了 PDF。

谢谢。

4

1 回答 1

2

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

为防止此会话死锁,请通过添加session_write_close();before 命令关闭会话以进行写入,如果您需要在 PDF 渲染后再次写入会话,请在 PDF 渲染session_start();后添加

于 2016-02-03T13:29:32.030 回答