PHP5, Shell_exec ожидает завершения порожденных задач оболочки Linux

Я пытаюсь запустить сценарий оболочки Linux из PHP5, который будет работать в течение 24 часов, но я хочу, чтобы веб-страница вернулась в течение нескольких секунд. Я думал, что это можно решить, создав скрипт, порождающий задачу, но, похоже, это не работает.

Я искал решение или вариант «один выстрел / выстрелил и забыл» в течение нескольких дней, но безуспешно.

В следующем примере показана проблема.

В PHP 5 я делаю один из следующих вызовов (много пробовал на этом этапе)

passthru("dummy_script.sh");

or

system("dummy_script.sh");

or

shell_exec("dummy_script.sh");

Фиктивный сценарий выглядит следующим образом:

#!/bin/sh
{
  while true                             
  do 
    sleep 1
  done
} &

Я вижу, как этот процесс запускается, но веб-страница не возвращается, пока я не сделаю killall dummy_script.sh. Если я запускаю сценарий вручную в терминале, он немедленно возвращается и запускает цикл.

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

Надеюсь, вы, ребята, можете мне помочь, это было бы очень полезно.


person Dan Damgaard Levsen    schedule 06.02.2015    source источник


Ответы (1)


Чтобы ответить на ваш вопрос:

  1. Вы можете начать просмотр pcntl_fork. Или вы можете проверить это. По сути, вы используете родную вилку для разветвления долгого процесса, поэтому вашему php-интерфейсу не нужно ждать.
  2. Если вы любите приключения, вы можете поместить свою «работу» (ваш запрос в этот длительный процесс) в БД. Затем задание cron проверяет БД на наличие входящих запросов, и именно оно выполняет этот процесс.
  3. Другой способ - использовать resque, но пока не беспокойтесь.
person Kyle Domingo    schedule 06.02.2015
comment
Спасибо за быстрый ответ. Это возможное решение, и пока хорошее исправление. Но я не собираюсь тратить ресурсы на ожидание завершения процесса. Нет ли вариантов отправки команды, не дожидаясь ее завершения? (вариант «выстрелил и забыл») - person Dan Damgaard Levsen; 06.02.2015