Приветствую.
Не так давно я наткнулся на статью о том, что PHP создан, чтобы умирать. Важное пояснение - это не "PHP-ненавистничество", контекст слова "умирать" здесь совершенно другой - а именно указывается на архитектурную особенность ядра - то есть получить данные, обработать и завершить действие (завершить существование процесса, "умереть"). Таким образом, PHP становится непригоден, по версии автора статьи, к фоновой обработке процессов, либо же нужен "кто-то", кто будет следить за тем, чтобы PHP не завершил свой действие.
Отчасти, я согласен с автором, поскольку язык действительно имеет корни вовсе не в программировании серверных процессов. Однако же мне интересно как выразить собственное мнение, поделившись им с посетителями, так и обсудить правильность утверждения в заголовке в целом. В самом деле - автор статьи опирается на то, что в PHP очень плохо устроена работа с памятью из-за её хеш-устройства, вследствие чего отслеживать зависимые ссылки очень трудно (да и возможно ли на 100%?). И это правда. PHP действительно имеет проблему утечки.
Но верно ли то, что PHP не в состоянии средствами самого себя позаботиться о своих же процессах? Я считаю, нет. Первое, на что бы я хотел обратить внимание - это сборщик мусора, он появился достаточно давно, с PHP 5.3. Однако же, можно возразить, что 100% очистки он не даст, да и иногда бывает, что память нужна сразу же, после unset, например. Второе, что бы я отнёс к средствам саморегуляции - это register_shutdown_function. Напомню, она выполнится всегда при аварийном завершении скрипта - будь то необработанное исключение, либо же более глобальная проблема наподобие нехватки памяти (но не будет вызвана при получении системного прерывания, разумеется, что позволит прервать исполнение такого демона путём, например, команды kill). И этим-то и можно воспользоваться как раз для создания "чего-то" надёжного, что может следить за другими процессами PHP. Иными словами, PHP будет следить за PHP. Просто добавим это:
1. EuGen - 15 Мая, 2013 - 14:18:37 - перейти к сообщению
- и, очевидно, процесс-контролёр будет сам себя перезапускать при завершении работы. Разумеется, '/usr/bin/php' нужно вынести в константу, к примеру, но здесь суть в самом способе. Это - одна из возможностей заставить PHP саморегулироваться. Если же процесс не создаёт сущностей, которым нужно непрерывно "жить", то конструкцию выше можно добавлять и непосредственно в такой скрипт (например, сама конструкция взята из демона-рассыльщика SMS-сообщений, которому, очевидно, не критично прерывание, поскольку неотправленные сообщения не получают статуса отправки и после перезапуска старт начинается с начала очереди).
Автор статьи указывает на использование, например, crond для аналогичного способа контроля, но это, во-первых, не решает проблему с вопросом немедленного реагирования (минута - минимальная величина дискретизации запуска в crond - может быть слишком критична), а во-вторых, всё же показывает именно то, что PHP сам по себе не может быть надёжным.
Интересно было бы узнать, какие способы вы используете, если требуется решать серверные задачи посредством PHP-процессов (а, может, не решаете вовсе с помощью PHP, используя другие языки, например, Python?) и обсудить их с другими заинтересовавшимися участниками.