У меня есть команда, которую я хочу запустить, но я не хочу, чтобы PHP сидел и дождался результата.
<?php echo "Starting Script"; exec('run_baby_run'); echo "Thanks, Script is running in background"; ?>
Возможно ли, чтобы PHP не дождался результата. То есть просто отпустите его и перейдите к следующей команде.
Я не могу найти что-нибудь и не уверен, что это возможно. Лучшее, что я мог найти, это тот, кто запустил работу CRON, чтобы начать через минуту.
Всегда хорошо проверять документацию :
Чтобы выполнить команду, если она не повесила ваш php-скрипт во время ее запуска, запущенная вами программа не должна выводиться обратно на php. Для этого переадресуйте как stdout, так и stderr в / dev / null, а затем запустите его.
>
/dev/null 2>&1 &
Чтобы выполнить команду и она порождена как другой процесс, который не зависит от потока apache, чтобы продолжать работать (не умрет, если кто-то отменяет страницу), запустите это:
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
Вы можете запустить команду в фоновом режиме, добавив &
в конце ее как:
exec('run_baby_run &');
Но выполнение этого только повесит ваш скрипт, потому что:
Если программа запускается с функцией exec, чтобы она продолжала работать в фоновом режиме, вывод программы должен быть перенаправлен в файл или другой выходной поток. В противном случае PHP зависнет до завершения программы.
Таким образом, вы можете перенаправить команду stdout команды в файл, если вы хотите увидеть ее позже или в /dev/null
если вы хотите отменить ее как:
exec('run_baby_run > /dev/null &');
Хорошо, вот окончательный окончательный правильный удостоенный наград ответ 😉
Это использует 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);
"exec nohup setsid your_command"
nohup позволяет вашей команде продолжать, даже если запущенный процесс может завершиться первым. Если это произойдет, сигнал SIGNUP будет отправлен в команду your_command, что приведет к ее завершению (если только он не поймает этот сигнал и не проигнорирует его).