Правильный запуск PHP-скриптов в бекграунде
Переодически при разработке различных проектов перед нашей командой
встает задача запуска PHP-скрипта в бекграунде для выполнения каких-либо
тривиальных действий, будь то какое-то длительное импортирование
изображений или простой граббинг чего-либо с переодическим оповещением о
статусе процесса. И каждый раз после пробного выполнения команды вроде
"$ php -q script.php > script.log &" мы получаем то, что скрипт
перестает выполняться сразу же после запуска: "[1]+ Stopped php -q
script.php > script.log".
Причиной тому является определенное поведение PHP-интерпретатора когда он теряет связь с запустившим его клиентом, а в данном случае — с вводом командной строки.
Если изучить PHP-документацию по работе с соединениями,
то оттуда можно узнать что таким поведением можно управлять при помощи
директивы конфигурации или же функции вызываемой непосредственно в самом
PHP-скрипте — ignore_user_abort.
Таким образом, по идее, остановка выполнения PHP-скрипта после
отсоединения клиента не должна происходить если включить игнорирование
отсоединения клиента, но мы, к сожалению, не смогли добиться нужного
поведения при использовании этой директивы или функции и PHP-скрипты
запускаемые в бекграунде продолжали «умирать» сразу же после запуска.
Сейчас уже эта проблема конечно же не вызывает ни ступора, ни поисков
нужной информации, но в свое время «съела» пару часов на поиск нужного
решения и проверку/отладку найденных способов, поэтому я хочу во-первых
поделиться со всеми читателями данным трюком, а во-вторых, написав этот
пост, освежить и закрепить в памяти простой способ решения проблемы
запуска PHP-скриптов в бекграунде, чтобы они выполнялись до конца ;)
Итак, решение очень простое — нужно дать PHP-скрипту то, что ему нужно —
поток ввода, который он будет считать клиентом и не будет завершать
свою работу:
$ php -q script.php < /dev/null > script.log &
UPD: А так же, как верно подсказывают в комментариях, можно воспользоваться утилитой nohup, которая при правильном оперировании перенаправлением потоков стандартного вывода и вывода ошибок, позволяет добиться тех же результатов, но такой способ не работал при тестировании его например на Mac OS:
$ nohup php -q script.php > script.log 2>&1 &
После запуска подобной команды PHP-скрипт не «умрет» сразу же после
запуска, а продолжит запланированную работу до тех пор пока ее не
выполнит!
Надеюсь что этот небольшой хинт поможет кому-то сэкономить пару часов! ;)
Источник: http://habrahabr.ru/blogs/php/137337/ |
Категория: тупой копи-паст | Добавил: skaspy (01.02.2012)
|
Просмотров: 946 | Комментарии: 1
| Рейтинг: 0.0/0 |
|