Команда 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, что приведет к ее завершению (если только он не поймает этот сигнал и не обратит на него внимания).