Каков наилучший способ, чтобы PHP-скрипт работал как демон? - PullRequest
8 голосов
/ 02 сентября 2008

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

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

Ответы [ 9 ]

4 голосов
/ 02 сентября 2008

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

3 голосов
/ 28 апреля 2012

Самое элегантное решение - phpdaemon или ReactionPHP .

3 голосов
/ 21 сентября 2008

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

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

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

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

3 голосов
/ 02 сентября 2008

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

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

Замените USER на пользователя, под которым запускается демон, а SCRIPTNAME на имя вашего скрипта. Вставьте это в /etc/cron.d/restart_php_daemon. Это должно работать каждую минуту. Измените первый * на */2 или */5, чтобы запускать его реже.

UPDATE

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

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

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME
1 голос
/ 07 марта 2014

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. Вы можете прочитать это на ссылка

1 голос
/ 02 сентября 2008

Я успешно запустил wget и отправил результат в / dev / null на общем сервере.

0 голосов
/ 07 февраля 2011

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

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

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

0 голосов
/ 21 сентября 2008

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

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

0 голосов
/ 02 сентября 2008

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

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

...