Тайм-аут PHP proc_open и exec, но cli работает нормально

В настоящее время я использую компонент Symfony Process, который опирается на функцию proc_open PHP. Мне нужно запустить команду на 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"`

Когда я запускаю эту команду непосредственно в своей оболочке, она работает просто отлично и выполняется около 6 секунд. Но когда я использую PHP с компонентом процесса, он уходит в тайм-аут... А при использовании функций exec или proc_open он работает бесконечно. Тайм-аут по умолчанию для компонента процесса составляет 60 секунд (даже его продление не имеет никакого эффекта).

Я пробовал это на PHP 5.4 и PHP 5.5, но результат, похоже, тот же.

Любые идеи, почему эта команда отлично работает в оболочке, но не через PHP? Протестировано в средах MAMP, а не в средах MAMP (в версиях 5.4 и 5.5). Однако он работает на Ubuntu 14.04 с PHP 5.5.

Я подумал, что, возможно, при прохождении через PHP и MAMP процесс может быть завершен, но все еще зависает, как сообщалось с помощью эта ошибка ? Я обновлю, когда у меня будет больше информации, чтобы увидеть, действительно ли PDF-файл сгенерирован или нет.

Спасибо.


person Talus    schedule 21.07.2014    source источник
comment
Почему бы вам просто не использовать KnpSnappyBundle — knpbundles.com/KnpLabs/KnpSnappyBundle?   -  person dmnptr    schedule 21.07.2014
comment
Быстрее использовать непосредственно компонент Symfony Process, и мне нужно сначала создать некоторые параметры, где Snappy менее гибок. Но проблема все равно останется...   -  person Talus    schedule 21.07.2014


Ответы (1)


Проблема может быть вызвана блокировкой сеанса — текущий поток PHP-страницы блокирует сеанс для записи, поэтому другая страница на том же сервере ожидает разблокировки сеанса (в функции sessions_start()) для обработки запроса (сброс в PDF). Это создает тупиковую блокировку, поскольку сеанс по умолчанию начинается с блокировки записи для других потоков.

Чтобы предотвратить тупик этого сеанса, закройте сеанс для записи, добавив session_write_close(); перед командой, и если вам нужно снова записать в сеанс сразу после рендеринга PDF, добавьте session_start(); после рендеринга PDF.

person Maciej Pyszyński    schedule 03.02.2016