Команда php exec (или аналогичная), чтобы не дождаться результата

У меня есть команда, которую я хочу запустить, но я не хочу, чтобы PHP сидел и дождался результата.

<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>

Возможно ли, чтобы PHP не дождался результата, то есть просто отпустите его и перейдите к следующей команде.

Я не могу найти что-нибудь и не уверен, что это возможно. Лучшее, что я мог найти, это тот, кто запустил работу CRON через минуту.

Ответ 1

Всегда полезно проверить документацию:

Чтобы выполнить команду, не повредите ваш php script, пока он запускается, программа, которую вы запускаете, не должна выводить обратно на php. Сделать это, переадресуйте как stdout, так и stderr в /dev/null, а затем запустите его.

> /dev/null 2>&1 &

Чтобы выполнить команду и он появился как еще один процесс, который не зависит от потока apache продолжать работать (не умрет, если кто-то отменяет страницу):

exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');

Ответ 2

Вы можете запустить команду в фоновом режиме, добавив & в конце ее как:

exec('run_baby_run &');

Но только одно это повесит ваш script, потому что:

Если программа запускается с помощью функции exec, для продолжения работы в фоновом режиме вывод программы должен быть перенаправлен в файл или другой выходной поток. В противном случае PHP зависнет до завершения программы.

Итак, вы можете перенаправить команду stdout команды в файл, если вы хотите увидеть ее позже или /dev/null, если вы хотите отменить ее как:

exec('run_baby_run > /dev/null &');

Ответ 3

Хорошо, здесь окончательный окончательный правильный награжденный ответ; -)

Это использует wget для уведомления URL-адреса чего-либо, не ожидая.

$command = 'wget -qO- http://test.com/data=data';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

Это использует ls для обновления журнала без ожидания.

$command = 'ls -la > content.log';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);

Ответ 4

"exec nohup setid your_command"

nohup позволяет вашей команде продолжать работу, даже если запущенный процесс может завершиться первым. Если это так, сигнал SIGNUP будет отправлен в команду your_command, что приведет к ее завершению (если только он не поймает этот сигнал и не обратит на него внимания).