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

У меня есть PHP script, который прослушивает очередь. Теоретически, он никогда не должен умирать. Есть ли что-то, чтобы проверить, все ли работает? Что-то вроде Ruby God ( http://god.rubyforge.org/ ) для PHP?

Бог является агностиком языка, но было бы неплохо иметь решение, которое работает и с окнами.

Ответ 1

У меня была такая же проблема - я хочу проверить, работает ли script. Поэтому я придумал это, и я запускаю его как работу cron. Он захватывает запущенные процессы как массив и циклически выполняет каждую строку и проверяет имя файла. Кажется, хорошо работает. Замените # user # вашим пользователем script.

exec("ps -U #user# -u #user# u", $output, $result);
foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";

Ответ 2

Просто добавьте вторую команду после script. Когда/если он останавливается, вызывается вторая команда. Например:.

php daemon.php 2>&1 | mail -s "Daemon stopped" [email protected]

Edit:

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

Ответ 3

В linux выполните ps следующим образом:

ps -C php -f

Затем вы можете сделать в php script:

$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" в списке запущенных процессов, если он не запускает этот процесс и не ждет завершения процесса для продолжения делая то, что он делает.

Ответ 4

Простой bash script

#!/bin/bash
while [true]; do
    if ! pidof -x script.php;
    then
        PHP скрипт.php &
    fi
done

Ответ 5

Не для окон, но...

У меня есть несколько длинных PHP-скриптов, у которых оболочка script обертывает его. Вы можете по желанию вернуть значение из script, которое будет проверено в shell- script, для выхода, перезагрузки немедленно или спящего режима в течение нескольких секунд, а затем перезапустите.

Вот простой, который просто запускает PHP script, пока он не будет остановлен вручную.

#!/bin/bash
clear
date
php -f cli-SCRIPT.php
echo "wait a little while ..."; sleep 10
exec $0

"exec $0" перезапускает script, не создавая подпроцесс, который придется разгадать позже (и занять ресурсы в это время). Этот bash script обертывает почтового отправителя, поэтому это не проблема, если он выйдет и приостанавливается на мгновение.

Ответ 6

Одним из возможных решений является прослушивание порта через функции сокета. Вы можете проверить, что сокет все еще прослушивается с помощью простого script. Даже служба мониторинга, такая как pingdom, могла контролировать свой статус. Если он умирает, сокет больше не прослушивается.

Множество решений.. Удачи.

Ответ 7

Если у вас есть руки на script, вы можете просто попросить его установить значение времени каждые X раз в db, а затем дать задание cron проверить, соответствует ли это значение.

Ответ 8

troelskn писал (а):

Просто добавьте вторую команду после script. Когда/если он останавливается, вызывается вторая команда. Например:.

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

Это вызовет mail каждый раз, когда строка будет напечатана в файле daemon.php(это должно быть никогда, но все же.)

Вместо этого используйте оператор двойной амперсанды для разделения команд, т.е.

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

Ответ 9

Вы можете написать в своем 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

Ответ 10

Вдохновленный от Джастина Левене ответил и улучшил его, поскольку 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 делает нашу команду отличной от шаблона, который мы ищем.

Ответ 11

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

wrapper_for_test_php.sh

#!/bin/bash
php test.php

Затем вы просто проверите обертку, как если бы вы проверили любой другой bash script: pidof -x wrapper_for_test_php.sh

Ответ 12

Я использовал cmder для Windows и на основе этого script Я придумал этот, который мне удалось развернуть на linux позже.

#!/bin/bash
 clear
 date
 while true
 do
    php -f processEmails.php
    echo "wait a little while for 5 secobds..."; 
    sleep 5
 done