У меня есть PHP
скрипт, который прослушивает очередь. Теоретически, он никогда не должен умирать. Есть ли что-то, чтобы проверить, все ли работает? Что-то вроде Ruby's God ( http://god.rubyforge.org/ )
для PHP
?
Бог является агностиком языка, но было бы неплохо иметь решение, которое работает и над окнами.
У меня была такая же проблема – я хочу проверить, работает ли скрипт. Поэтому я придумал это, и я запускаю его как работу cron. Он захватывает запущенные процессы как массив и циклически выполняет каждую строку и проверяет имя файла. Кажется, хорошо работает. Замените # user # вашим пользователем скрипта.
exec("ps -U #user# -u #user# u", $output, $result); foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";
Просто добавьте вторую команду после скрипта. Когда / если он останавливается, вызывается вторая команда. Например.:
php daemon.php 2>&1 | mail -s "Daemon stopped" you@example.org
Технически это вызывает почтовую программу сразу, но только завершает команду, когда заканчивается php-скрипт. Выполнение этого позволяет получить вывод php-скрипта и включить в тело письма, что может быть полезно для отладки, из-за чего сценарий остановился.
В linux выполните ps следующим образом:
ps -C php -f
Вы могли бы сделать это в php-скрипте:
$output = shell_exec('ps -C php -f'); if (strpos($output, "php my_script.php")===false) { shell_exec('php my_script.php > /dev/null 2>&1 &'); }
В приведенном выше коде перечислены все запущенные процессы php, а затем проверяется, находится ли «my_script.php» в списке запущенных процессов, если он не запускает этот процесс и не ждет завершения процесса, чтобы продолжить выполнение делал.
Простой скрипт bash
#!/bin/bash while [true]; do if ! pidof -x script.php; then php script.php & fi done
Не для окон, но …
У меня есть несколько длинных PHP-скриптов, которые имеют оболочный скрипт, обертывающий его. Вы можете по желанию вернуть значение из скрипта, который будет проверяться в shell-скрипте, чтобы выйти, перезапустить сразу или спящий на несколько секунд, а затем перезапустить.
Вот простой, который просто запускает скрипт PHP до тех пор, пока он не будет остановлен вручную.
#! / Bin / Баш Чисто Дата php -f cli-SCRIPT.php эхо "подождать немного ..."; сон 10 exec $ 0
«Exec $ 0» перезапускает скрипт, не создавая подпроцесса, который придется разгадать позже (и занять ресурсы в это время). Этот сценарий bash обертывает почтового отправителя, поэтому это не проблема, если он выйдет и приостанавливается на мгновение.
Одним из возможных решений является прослушивание порта через функции сокета. Вы можете проверить, что сокет все еще прослушивается с помощью простого скрипта. Даже служба мониторинга, такая как pingdom, могла контролировать свой статус. Если он умирает, сокет больше не прослушивается.
Много решений .. Удачи.
Если у вас есть руки на скрипте, вы можете просто попросить его установить значение времени каждые X раз в db, а затем позволить заданию cron проверить, соответствует ли это значение.
troelskn писал:
Просто добавьте вторую команду после скрипта. Когда / если он останавливается, вызывается вторая команда. Например.:
php daemon.php | mail -s "Daemon stopped" you@example.org
Это вызовет mail
каждый раз, когда строка будет напечатана в daemon.php (которая никогда не будет, но все же.)
Вместо этого используйте оператор двойных амперсандов для разделения команд, т. Е.
php daemon.php & mail -s "Daemon stopped" you@example.org
Вы можете написать в своем crontab что-то вроде этого:
0 3 * * * /usr/bin/php -f /home/test/test.php my_special_cron
Ваш файл test.php должен выглядеть следующим образом:
<?php php_sapi_name() == 'cli' || exit; if($argv[1]) { substr_count(shell_exec('ps -ax'), $argv[1]) < 3 || exit; } // your code here
Таким образом, у вас будет только один активный момент работы cron с помощью my-special-cron
качестве ключа процесса. Таким образом, вы можете добавить больше заданий в один и тот же php-файл.
test.php system_send_emails sendEmails
test.php system_create_orders orderExport
Вдохновленный ответом Джастина Левэна и улучшил его, поскольку ps -C
не работает на Mac, что мне нужно в моем случае. Таким образом, вы можете использовать это в php-скрипте (возможно, только до того, как вам понадобится демон), протестирован как в Mac OS X 10.11.4, так и в Ubuntu 14.04:
$daemonPath = "FULL_PATH_TO_DAEMON"; $runningPhpProcessesOfDaemon = (int) shell_exec("ps aux | grep -c '[p]hp ".$daemonPath."'"); if ($runningPhpProcessesOfDaemon === 0) { shell_exec('php ' . $daemonPath . ' > /dev/null 2>&1 &'); }
Маленькая, но полезная деталь: почему grep -c '[p]hp ...'
вместо grep -c 'php ...'
?
Потому что при подсчете процессов grep -c 'php ...'
будет считаться процессом, который соответствует нашему шаблону. Поэтому использование регулярного выражения для первой буквы php делает нашу команду отличной от шаблона, который мы ищем.
Если у вас возникли проблемы с проверкой подлинности PHP-скрипта, вы можете сделать тривиальную оболочку и проверить ее. Я недостаточно знаком с сценариями Windows, чтобы показать, как это делается здесь, но в Bash это будет выглядеть …
wrapper_for_test_php.sh
#!/bin/bash php test.php
Тогда вы просто проверите обертку, как если бы вы проверили любой другой сценарий bash: pidof -x wrapper_for_test_php.sh
Я использовал cmder для окон и на основе этого скрипта я придумал этот, который мне удалось развернуть на linux позже.
#!/bin/bash clear date while true do php -f processEmails.php echo "wait a little while for 5 secobds..."; sleep 5 done