2015-07-22 1 views
0

У меня есть PHP-скрипт, который делает некоторые тяжелый, что я пытаюсь выстрелить в качестве фонового сценария, используя следующий код:Timeout проблема при запуске фонового PHP скрипта как веб

exec("script.php > /dev/null 2> /dev/null &");

Что происходит:

  • Когда я запускаю код, указанный выше как часть моего веб-приложения, сценарий завершает работу примерно через минуту.

  • Когда я запускаю код как часть моего веб-приложения без окончательного амперсанд, работа работает нормально - но exec() ждет сценария к полной перед загрузкой на следующую страницу, поражение цели, как пользователь смотрит на не отвечающая страница.

  • Когда я запускаю команду оболочки script.php > /dev/null 2> /dev/null & как себя из консоли с последним амперсандом, работа выполняется нормально.

  • Когда я запустил команду оболочки с консоли в качестве веб-страницы, работа перестает работать примерно через минуту.

Я попытался подключить свой вывод к лог-файлам: script.php > /home/public/tmp/output.txt 2> /home/public/tmp/errors.txt &. Результат выглядит нормально, я не получаю никаких ошибок. Сценарий просто перестает работать.

Основное правило выглядит следующим образом: Если вы выполняете процесс переднего плана как веб-сайт или как я, он будет завершен. Если вы выполняете фоновый процесс как web, он перестает работать примерно через минуту.

Я не запускаю это как cronjob, потому что мой хост (NearlyFreeSpeech) может запускать cronjob только один раз в час, что больше, чем я хочу, чтобы пользователи подождали, когда задание займет всего пару минут - это может быть как когда запускаются пользователи.

Нижний индекс начинается с set_time_limit(60 * 60 * 4);, так что это не должно быть вопросом синхронизации времени PHP.

+0

попробуйте выполнить вывод вашего вывода в файл журнала, чтобы узнать, произошла ли ошибка или что-то неожиданное. 'Script.php> /tmp/script.log 2> & 1 &' –

+0

Пробовал это. Он просто прекращает бесцеремонно. – schnauss

+0

60 секунд звучит подозрительно, как проблема с таймаутом ... try dumping 'phpinfo()' в ваш выходной журнал, чтобы гарантировать, что 'max_execution_time' обновляется вашим' set_time_limit() 'вызовом? (хостинговые компании могут ограничить то, что вы можете установить, чтобы предотвратить неблагоприятные последствия для других пользователей) –

ответ

0
set_time_limit 

не включает время выполнения оболочки. http://php.net/manual/en/function.set-time-limit.php

Попробуйте использовать примеры кода в комментариях к этому сайту.

+0

Неправда, я просто проверил ее сам; 'set_time_limit (1)' get me 'Fatal Error Error: максимальное время выполнения превысило 1 секунду. – schnauss