Каков наилучший способ сохранить скрипт PHP в качестве демона?

Каков наилучший способ сохранить PHP-скрипт, запущенный как демон, и как лучше всего проверить, нужно ли перезапуск.

У меня есть несколько сценариев, которые нужно запускать 24/7, и по большей части я могу запускать их с помощью nohup . Но если они снизятся, что лучше всего контролировать, чтобы его можно было автоматически перезапустить?

Related of "Каков наилучший способ сохранить скрипт PHP в качестве демона?"

Если вы не можете использовать (правильную) структуру init для этого (вы используете общий хостинг и т. Д.), Используйте cron для запуска скрипта (его можно записать на любом языке, который вам нравится) каждые несколько минут, который проверяет проверьте, запущены ли они, и при необходимости перезапустит их.

Мы запускаем наших демонов, отправляя вывод на почту.

php daemon.php | mail -s "daemon stopped" foo@example.org 

Таким образом, когда / если демон остановится, он отправит почту, и мы будем уведомлены таким образом.

Конечно, это все равно означает ручной перезапуск демонов, но мы сразу узнаем. Обычно, если демоны останавливаются, это означает, что есть что-то еще, о чем нужно позаботиться, так что это нормально.

Быстрый и грязный cron для перезапуска вашего демона:

 * * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME 

Замените ПОЛЬЗОВАТЕЛЯ пользователем, который работает демон, и SCRIPTNAME с именем вашего скрипта. Вставьте это в /etc/cron.d/restart_php_daemon . Он должен работать каждую минуту. Измените первый * на */2 или */5 чтобы работать менее часто.

ОБНОВИТЬ

Если вы помещаете это в свой собственный кронтаб:

Запустите crontab -e и добавьте:

 * * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME 

Наиболее элегантным решением является phpdaemon или reactPHP .

У меня был успех при запуске wget и отправке результата на / dev / null на общем сервере.

Daemon – это процесс linux, который работает в фоновом режиме; apache или mysql являются демонами. В среде linux мы можем запускать фоновую программу с помощью cronjob, но она имеет некоторые ограничения, и в некоторых сценариях это не очень хорошая идея. Например, используя cronjob, мы не можем контролировать, закончил ли предыдущий запуск еще. Поэтому часто удобнее запускать процесс как демон.

 // Daemonize $pid = pcntl_fork(); // parent gets the child PID and child gets 0 if($pid){ // if pid is not 0 // Only the parent will know the PID. Kids aren't self-aware // Parent says goodbye! print "Parent : " . getmypid() . " exiting\n"; exit(); } print "Child : " . getmypid() . "\n"; 

Вышеприведенный код взят из очень хорошей статьи о том, как создать демона в php. Вы можете прочитать это по ссылке

Я использую PHP-скрипт для чтения из базы данных и отправки электронных писем (используя библиотеку PEAR Mail_Queue). Я запускаю его из сценария bash и на основе возвращаемого результата (из «exit $ status;») либо останавливается, либо спящий X секунд, либо сразу же перезапускается. (Я также поставил проверку средней загрузки / сна в PHP-скрипт, чтобы не подчеркивать почтовую систему).

Если это было для долгосрочного демона, который должен был постоянно работать, то я согласен, вероятно, было бы не лучшим, что можно было бы запустить (хотя я слышал о некоторых серверах сокетов, которые успешно выполнялись в долгосрочной перспективе) PHP 5.3 также теперь улучшил сборку мусора, и если сценарий достаточно хорошо написан, чтобы не выйти из незапланированных, тогда память должна быть гораздо менее сложной, чем раньше.

Я согласен с тем, что PHP не лучший инструмент для этого, однако я могу понять, почему вы хотите использовать PHP, чтобы вы могли повторно использовать компоненты из вашего приложения, такие как доступ к базе данных, и так далее.

У меня была аналогичная проблема, и я закончил разработку The Fat Controller, который является демоном, написанным на C, который может запускать скрипты PHP. Он также может работать как многопоточный демон, одновременно запуская множество экземпляров сценария.

Здесь есть дополнительная информация и примеры использования: http://www.4pmp.com/fatcontroller/

TBH, PHP, вероятно, не лучший инструмент для этого, действительно не тот, для чего он был предназначен. Я слышал о утечке памяти и других плохих вещах, которые случаются при попытке этого. Также помните, что PHP имеет только конечное количество идентификаторов ресурсов (для дескрипторов файлов, ect db соединений) за выполнение сценария.

Лучше использовать что-то другое, возможно, python или perl, хотя у меня нет реального опыта написания таких приложений, но я знаю, что PHP не подходит для ваших попыток.