Intereting Posts
Зачем считать плохо, чем $ count Завершение кода Phpstorm не работает на php-методах Как это называется, когда вы можете заполнить строку с помощью <<< и end-delimiter? Как я могу выполнить поиск Google с PHP-страницы? Неверное значение столбца mysql Как повысить производительность с помощью Vim и Eclipse для проектов PHP5.3 (возможно, используя интеграцию Eclim с Zend Studio) Сервер MySQL не возвращает правильный вывод Переключить сервер сайта WordPress Получение необработанной строки запроса SQL из подготовленных операторов PDO Поворот K копланарных точек на плоскость, параллельную плоскости x, y HTML-код, не работающий над вызовом jquery, вместо этого выводит HTML-код МетодNotAllowedHttpException в строке RouteCollection.php 218: 4 PHP: как я могу сортировать и фильтровать «массив», то есть объект, реализующий ArrayAccess? mysql_fetch_array () ожидает, что параметр 1 будет проблемой ресурса Обновление динамически страницы через ajax и php

Как проверить, работает ли php-скрипт

У меня есть 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