PHP proc_open & exec timeout, но 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 или нет.
Благодарю.
1 ответ
Проблема может быть вызвана блокировкой сеанса - текущий поток страниц PHP блокирует сеанс записи, поэтому другая страница на том же сервере ожидает разблокирования сеанса (включено sessions_start()
функция) для обработки запроса (дамп в PDF). Это создает мертвую блокировку, потому что сессия по умолчанию начинается с блокировки записи для других потоков.
Чтобы предотвратить эту взаимную блокировку сеанса, закройте сеанс для записи, добавив session_write_close();
перед командой и, если вам нужно снова написать в сеанс сразу после рендеринга PDF, добавьте session_start();
после рендеринга PDF