2008-09-01 6 views
8

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

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

+0

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

ответ

4

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

+0

Можете ли вы рассказать о том, что «использовать [правильную] структуру инициализации для этого?» И как это решит проблему обеспечения работы скрипта? –

-1

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

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

+0

Не пытаясь звучать грубо, вы должны удалить этот ответ, он демонстрирует огромный уровень дезинформации и недостатка знаний. «конечное количество идентификаторов ресурсов» обрабатывается операционной системой, а не PHP. Поэтому любой другой язык имел бы то же ограничение. Увидев, что PHP использует ту же библиотеку для управления процессами, что и язык C, вы можете уточнить, почему это не подходит для этого, поскольку у вас есть такая же сила в вашем распоряжении, как и у C. Я понимаю неприязнь к конкретному языку, но я никогда не пойму, что происходит с распространенной дезинформацией. –

1

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

3

быстро и без хрон, чтобы перезапустить демон:

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

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

UPDATE

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

Run crontab -e и добавить:

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

Это похоже на действительно удобную идиому, но я не уверен, что это работает на mac osx и/или если у вас нет доступа root. У вас есть эквивалент для записи в собственном файле crontab пользователя? – dreeves

+0

Когда я запустил «ps auxwww | grep meh» в командной строке, он возвращает: --- --- имя пользователя 2803 0.0 0.0 61156 724 pts/0 SN + 06:19 0:00 grep meh --- --- Если это действительно cron работает, как это работает? Это не выход из cron? – joedevon

+0

Вы не пытаетесь получить вывод ps .. вот почему вы перенаправляете его на/dev/null. grep проверяет наличие SCRIPTNAME в выводе ps. Если он есть, он возвращает 0, иначе отличный от нуля. || SCRIPTNAME будет выполняться только в том случае, если grep возвращает ненулевое значение, которое запускает команду. –

0

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

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

3

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

php daemon.php | mail -s "daemon stopped" [email protected] 

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

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

+0

Вы можете перенаправить 'stderr' в' stdout' и отправить почту, также используя '2> & 1' перед трубой. –

0

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

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

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^