Как проверить, работает ли 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