Comments 33
Может, пригодиться: Про перехват и обработку фатальных ошибок (Fatal Error) в PHP ©dkLab
Насколько универсален данный способ проверки того, что демон уже запущен? О винде, конечно, не говорю. Нельзя ли блокировками файлов воспользоваться?
Насколько универсален данный способ проверки того, что демон уже запущен? О винде, конечно, не говорю. Нельзя ли блокировками файлов воспользоваться?
Если вы про monit, то у него есть куча разных тестов: это порты (причём поддерживается тонна протоколов), использование ресурсов, проверка пидов, проверка файлов и пр. Подробнее смотрите в мануале.
На практике мне обычно хватало раз в N минут проверить, открыт ли сетевой порт YYYY. Если нет — перезапуск демона на этом порту. Если Z попыток обломалось — емыло мне. Такой схемы хватает в большинстве случаев
На практике мне обычно хватало раз в N минут проверить, открыт ли сетевой порт YYYY. Если нет — перезапуск демона на этом порту. Если Z попыток обломалось — емыло мне. Такой схемы хватает в большинстве случаев
Можно через блокировки файлов. Это будет универсальней и кросс-платформенней, просто открывать файл c эксклюзивным локом.
<?php
$fp = fopen("/tmp/lock.txt", «w»);
if (flock($fp, LOCK_EX)) { // do an exclusive lock
//some logic here
} else {
die;
}
…
fclose($fp);
<?php
$fp = fopen("/tmp/lock.txt", «w»);
if (flock($fp, LOCK_EX)) { // do an exclusive lock
//some logic here
} else {
die;
}
…
fclose($fp);
Использую такой код, еще не встречал случаи когда ошибка не обрабатывалась:
register_shutdown_function(«dbg_last_error»);
function dbg_last_error(){
$e=error_get_last();
if(($e[«type»] & E_COMPILE_ERROR) || ($e[«type»] & E_ERROR) ||
($e[«type»] & E_CORE_ERROR) || ($e[«type»] & E_RECOVERABLE_ERROR))
trace("[".$e[«type»]."] ".$e[«file»].":".$e[«line»]."\n".
$e[«message»]."\n", array(), «error»);}
register_shutdown_function(«dbg_last_error»);
function dbg_last_error(){
$e=error_get_last();
if(($e[«type»] & E_COMPILE_ERROR) || ($e[«type»] & E_ERROR) ||
($e[«type»] & E_CORE_ERROR) || ($e[«type»] & E_RECOVERABLE_ERROR))
trace("[".$e[«type»]."] ".$e[«file»].":".$e[«line»]."\n".
$e[«message»]."\n", array(), «error»);}
первым же делом проверил приведенный пример через браузер.
Строчки «Program still executing....» я так и не увидел, зато "(! ) Fatal error: Call to undefined function ololo() in /home/www/test/fatal.php on line 59" светилась во весь экран
Строчки «Program still executing....» я так и не увидел, зато "(! ) Fatal error: Call to undefined function ololo() in /home/www/test/fatal.php on line 59" светилась во весь экран
нужно смотреть какие у вас настройки php
в частности html_errors, т.к. это рабочий вариант.
в частности html_errors, т.к. это рабочий вариант.
html_errors On
output_buffering 4096
какие еще нужны настроки?
output_buffering 4096
какие еще нужны настроки?
могу выслать вам php.ini с моей локальной машины, под котороый работает.
пхп, кстати, 5.2.6.
пхп, кстати, 5.2.6.
мы все фатальные ошибки заворачиваем через эксепшены.
про статью на ©dkLab уже упоминали.
пару слов о мониторинге:
у нас свой собственный мониторинг (к сожалению про монит я узнал поздно)
есть класс скриптов, которые должны жить «вечно»
алгоритм приблизительно следующий:
— скрит запускается по крону каждую минуту.
— скрипт проверяет кол-во запущенных копий, кстати метод тот же через ps ax -u | grep $scriptName
— если копий больше чем нужно, то завершаемся
— далее идет цикл на длительный интервал напрмер час
в цикле выполняем метод run() & sleep(1)
— далее выполняем ps ax -u | grep getmypid() и вычисляем занимаемую память
— если в конце цикла кол-во памяти превысит допустимый — цикл заканчиваем (так избегаем утечки памяти)
— перезапускаем процесс используя php-forker
это позволяет нам запустить процесс не ровно в 00сек а например в 05сек (и не ждем 55 сек)
крон — для подтсраховки, хотя существует собственный мониторинг работы процессов.
про статью на ©dkLab уже упоминали.
пару слов о мониторинге:
у нас свой собственный мониторинг (к сожалению про монит я узнал поздно)
есть класс скриптов, которые должны жить «вечно»
алгоритм приблизительно следующий:
— скрит запускается по крону каждую минуту.
— скрипт проверяет кол-во запущенных копий, кстати метод тот же через ps ax -u | grep $scriptName
— если копий больше чем нужно, то завершаемся
— далее идет цикл на длительный интервал напрмер час
в цикле выполняем метод run() & sleep(1)
— далее выполняем ps ax -u | grep getmypid() и вычисляем занимаемую память
— если в конце цикла кол-во памяти превысит допустимый — цикл заканчиваем (так избегаем утечки памяти)
— перезапускаем процесс используя php-forker
это позволяет нам запустить процесс не ровно в 00сек а например в 05сек (и не ждем 55 сек)
крон — для подтсраховки, хотя существует собственный мониторинг работы процессов.
Не понимаю, почему все пытаются ссылаться на статью с ©dkLab, там такой же метод как у меня описан. Логика таже.
Только у меня обработка более сложная, как раз создается вечный процесс, за счет того, что форкается этот же процесс в обработчике ф-ии ob_start.
system(«php tester.php ». getmypid(). " &" );
Ну и предотвращается варианты, когда эти недообработанные скрипты висят и засоряют память.
if(isset($_SERVER[«argv»][1])){
file_put_contents(«php://stderr», «kill {$_SERVER['argv'][1]}: ». var_export(posix_kill($_SERVER['argv'][1], 15), true)."\n");
}
Только у меня обработка более сложная, как раз создается вечный процесс, за счет того, что форкается этот же процесс в обработчике ф-ии ob_start.
system(«php tester.php ». getmypid(). " &" );
Ну и предотвращается варианты, когда эти недообработанные скрипты висят и засоряют память.
if(isset($_SERVER[«argv»][1])){
file_put_contents(«php://stderr», «kill {$_SERVER['argv'][1]}: ». var_export(posix_kill($_SERVER['argv'][1], 15), true)."\n");
}
Ссылаются потому что там, в частности, предусмотрена ошибка «нехватка памяти». Во-вторых, как просто дополнение в вашей статье.
За работу с процессами, безусловно, спасибо. Только вот это не относится к тематике статьи:)
За работу с процессами, безусловно, спасибо. Только вот это не относится к тематике статьи:)
:-)
Ну я, наверное, не лучшее название выбрал просто для статьи.
Нужно было написать отказоустойчивого демона, который как птица феникс возрождается из пепла.
Поэтому и был описан механизм как это делалось. Ну а статью назвал так, потому что просил программиста из команды ловить фатал ероры, а он мне утверждал, что этого в php сделать невозможно в принципе. Поэтому разозлился и написал код, а потом и жту статью. :-)
Ну, кстати, благодаря статье бклаб узнал, что register_shutdown_function сейчас вызывается когда фаерится фатал ерор, раньше такого не было. :-)
Ну я, наверное, не лучшее название выбрал просто для статьи.
Нужно было написать отказоустойчивого демона, который как птица феникс возрождается из пепла.
Поэтому и был описан механизм как это делалось. Ну а статью назвал так, потому что просил программиста из команды ловить фатал ероры, а он мне утверждал, что этого в php сделать невозможно в принципе. Поэтому разозлился и написал код, а потом и жту статью. :-)
Ну, кстати, благодаря статье бклаб узнал, что register_shutdown_function сейчас вызывается когда фаерится фатал ерор, раньше такого не было. :-)
system(«php tester.php ». getmypid(). " &" );
форкая таким образом ты рождаешь зомби.
необходимо обрабатывать SIGCHL
именно чтоб не было зомби и был придуман php-forker :)
форкая таким образом ты рождаешь зомби.
необходимо обрабатывать SIGCHL
именно чтоб не было зомби и был придуман php-forker :)
нет, зомби не рождается. я же передаю ПИД текущего процесса (в котором произошла фатальная ошибка) во вновь созданный, и тот киляет этот старый процесс (который мог бы стать зомби)
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.1 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.1 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.1 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.0 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.0 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27468 0.5 0.3 54632 7472 ttyp1 S 12:22 0:00 php index.php 27460
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27468 0.2 0.3 54632 7472 ttyp1 S 12:22 0:00 php index.php 27460
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27468 0.2 0.3 54632 7472 ttyp1 S 12:22 0:00 php index.php 27460
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27941 1.0 0.3 54628 7472 ttyp1 S 12:23 0:00 php index.php 27468
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27941 0.2 0.3 54628 7472 ttyp1 S 12:23 0:00 php index.php 27468
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27941 0.0 0.3 54628 7484 ttyp1 S 12:23 0:00 php index.php 27468
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 29381 0.0 0.3 54628 7468 ttyp1 S 12:24 0:00 php index.php 29375
Видишь, кол-во процессов не растет, а их PID-ы меняются. Здесь нет зомби-процессов.
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.1 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.1 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.1 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.0 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 26548 0.0 0.3 54628 7480 ttyp1 S 12:21 0:00 php index.php 26494
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27468 0.5 0.3 54632 7472 ttyp1 S 12:22 0:00 php index.php 27460
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27468 0.2 0.3 54632 7472 ttyp1 S 12:22 0:00 php index.php 27460
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27468 0.2 0.3 54632 7472 ttyp1 S 12:22 0:00 php index.php 27460
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27941 1.0 0.3 54628 7472 ttyp1 S 12:23 0:00 php index.php 27468
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27941 0.2 0.3 54628 7472 ttyp1 S 12:23 0:00 php index.php 27468
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 27941 0.0 0.3 54628 7484 ttyp1 S 12:23 0:00 php index.php 27468
iminyaylo@md-1:~$ ps -aux | grep php | grep index.php | grep -v grep
40449 29381 0.0 0.3 54628 7468 ttyp1 S 12:24 0:00 php index.php 29375
Видишь, кол-во процессов не растет, а их PID-ы меняются. Здесь нет зомби-процессов.
Ну а это мой лог куда это пишется
kill 11162: true
live
before fork (pid: 11170)
kill 11170: true
live
live
before fork (pid: 11202)
kill 11202: true
live
before fork (pid: 11174)
kill 11174: true
live
before fork (pid: 11580)
kill 11580: true
live
before fork (pid: 11584)
kill 11584: true
kill 11162: true
live
before fork (pid: 11170)
kill 11170: true
live
live
before fork (pid: 11202)
kill 11202: true
live
before fork (pid: 11174)
kill 11174: true
live
before fork (pid: 11580)
kill 11580: true
live
before fork (pid: 11584)
kill 11584: true
Ну и я не создаю фактически дочерний процесс, дочерний процесс создается форком (pcntl_fork), здесь же я запускаю независимый процес, с другим адресным пространством посредством системного вызова. Так что тут не будет зомби.
PS мне сегодня тоже минусов за статью напихали
видно день такой…
видно день такой…
Sign up to leave a comment.
Как обрабатывать Fatal Error в PHP