MyTetra Share
Делитесь знаниями!
Правильный запуск PHP-скриптов в бекграунде
Время создания: 06.02.2012 00:16
Раздел: Компьютер - Программирование - Язык PHP
Запись: xintrea/mytetra_syncro/master/base/1328476610r1jfbmkd6d/text.html на raw.github.com

Переодически при разработке крупных проектов перед любой командой встает задача запуска 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-скрипт не «умрет» сразу же после запуска, а продолжит запланированную работу до тех пор пока ее не выполнит!


Надеюсь что этот небольшой хинт поможет кому-то сэкономить пару часов! ;)




Знаете ли вы, что:

SMM - это раскрутка посещаемости сайта через социальные сети. Веб-студия "Дело" может обеспечить для сайта активное продвижение в сетях smm. Основные площадки - ВКонтакте, Instagram, Facebook.



Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования