Как проверить, работает ли скрипт php - PullRequest
5 голосов
/ 23 сентября 2008

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

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

Ответы [ 12 ]

12 голосов
/ 11 декабря 2011

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

exec("ps -U #user# -u #user# u", $output, $result);
foreach ($output AS $line) if(strpos($line, "test.php")) echo "found";
6 голосов
/ 09 сентября 2015

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

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

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

php daemon.php 2>&1 | mail -s "Daemon stopped" you@example.org

Edit:

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

2 голосов
/ 23 сентября 2008

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

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

Вот простой пример, при котором скрипт PHP продолжает работать до тех пор, пока он не будет остановлен вручную.

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

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

2 голосов
/ 23 сентября 2008

Простой скрипт bash

#!/bin/bash
while [true]; do
    if ! pidof -x script.php;
    then
        php script.php &
    fi
done
1 голос
/ 17 ноября 2015

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

0 голосов
/ 07 ноября 2016

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

#!/bin/bash
 clear
 date
 while true
 do
    php -f processEmails.php
    echo "wait a little while for 5 secobds..."; 
    sleep 5
 done 
0 голосов
/ 22 сентября 2016

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

wrapper_for_test_php.sh

#!/bin/bash
php test.php

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

0 голосов
/ 01 апреля 2016

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

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

troelskn писал:

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

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

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

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

php daemon.php & mail -s "Daemon stopped" you@example.org
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...