Евгений Степанищев

Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

ПХП и Винда

Порядка полугода назад разговаривали с кем-то о кроссплатформенности скриптовых языков, речь и о ПХП шла, в частности. Я, памятуя о каких-то проблемах, связанных с тем, что когда-то разрабатывал на собственной машине под «Виндой», а потом переносил на «Линукс», доказывал, что по меньшей мере в ПХП всё плохо, но конкретных проблем вспомнить не мог.

А тут, на днях, нужно было продумать веб-сервис на ПХП, который именно под «Виндоуз» и работает, нужно обращаться к КОМ-объекту программы, которая только на этой платформе бывает. Сразу проблема всплыла.

По задумке внешний клиент дёргает «ручку» у сервиса, получает некий идентификатор и ждёт до поры до времени. Работа сервиса же какое-то время продолжается, тут я планировал использовать register_shutdown_function. Не тут-то было.

Функция не заработала правильно ни с «Апачем», ни с «Энжиникс», в комментариях пользователей к документации есть одинокий комментарий 2002-го года, который сообщает о проблеме:
Note that register_shutdown_function() does not work under Apache on Windows platforms. Your shutdown function will be called, but the connection will not close until the processing is complete. Zend tells me that this is due to a difference between Apache for *nix and Apache for Windows.
Похоже с тех пор ничего не изменилось. Ну хорошо, я вспомнил, что в последние ПХП входит патч php-fpm, который похожий функционал содержит — функцию fastcgi_finish_request. Оказалось, что php-fpm не работает под «Виндой».

Решили не перебирать больше решения, а сразу перейти на запуск отдельного фонового процесса. Оказалось и это не тривиально сделать. Под «Виндой» нужно это делать следующим образом:
$commandline = 'start /b тут-программа-которую-надо-запустить';
pclose(popen($commandline, 'r'));
Сплошные приключения.
11 комментариев
4 февраля 2012 18:04