У меня есть PHP-скрипт, который выполняет некоторые тяжелые действия, которые я пытаюсь запустить как фоновый скрипт, используя следующий код:
exec("script.php > /dev/null 2> /dev/null &");
Что просходит:
Когда я запускаю приведенный выше код как часть моего веб-приложения, скрипт завершает работу
примерно через минуту.
Когда я запускаю код как часть моего веб-приложения без окончательного
амперсанд, работа работает нормально — но exec()
ждет сценария
завершите работу перед загрузкой следующей страницы, победив цель, поскольку пользователь смотрит на неотвечающую страницу.
Когда я запускаю команду оболочки script.php > /dev/null 2> /dev/null &
как и я с консоли с последним амперсандом, работа работает нормально.
Когда я запускаю команду оболочки из консоли как web, задание останавливается примерно через минуту.
Я попытался передать свой вывод в лог-файлы: script.php > /home/public/tmp/output.txt 2> /home/public/tmp/errors.txt &
, Вывод выглядит нормально, я не получаю никаких ошибок. Скрипт просто перестает работать.
Кажется, что основное правило таково: если он будет запущен как основной процесс, как веб или как я, он завершится. Если запустить как фоновый процесс как веб, он перестает работать примерно через минуту.
Я не запускаю это как cronjob, потому что мой хост (NearlyFreeSpeech) может запускать cronjobs только один раз в час, что больше, чем я хочу, чтобы пользователи ждали, когда задание занимает всего пару минут — оно может также сработать, когда пользователи инициировать это.
Индекс начинается с set_time_limit(60 * 60 * 4);
так что это не должно зависеть от тайм-аута PHP.
set_time_limit
не включает время выполнения оболочки.
http://php.net/manual/en/function.set-time-limit.php
Попробуйте использовать примеры кода в комментариях на этом сайте.
Других решений пока нет …