Команда php exec (или аналогичная), чтобы не ждать результата
У меня есть команда, которую я хочу выполнить, но я не хочу, чтобы PHP сидел и ждал результата.
<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>
Возможно ли, чтобы PHP не ждал результата.. то есть просто включите его и перейдите к следующей команде.
Я не могу ничего найти, и не уверен, что это даже возможно. Лучшее, что я мог найти, это кто-то, кто делал бы CRON-работу, чтобы начать через минуту.
7 ответов
Всегда хорошо проверить документацию:
Чтобы выполнить команду, чтобы она не повесила ваш 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 будет зависать до тех пор, пока не закончится выполнение программы.
Таким образом, вы можете перенаправить стандартный вывод команды в файл, если вы хотите увидеть его позже или /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);
Я знаю, что на этот вопрос был дан ответ, но ответы, которые я нашел здесь, не сработали для моего сценария (или для Windows).
Я использую ноутбук с Windows 10 с PHP 7.2 в Xampp v3.2.4.
$command = 'php Cron.php send_email "'. $id .'"';
if ( substr(php_uname(), 0, 7) == "Windows" )
{
//windows
pclose(popen("start /B " . $command . " 1> temp/update_log 2>&1 &", "r"));
}
else
{
//linux
shell_exec( $command . " > /dev/null 2>&1 &" );
}
Это отлично сработало для меня.
Надеюсь, это поможет кому-то с windows. Ура.
Есть два возможных способа его реализации. Самый простой способ - это прямой результат для dev/null
exec("run_baby_run > /dev/null 2>&1 &");
Но если вам нужно выполнить какие-либо другие операции, вы можете рассмотреть ignore_user_abort. В этом случае скрипт будет работать даже после закрытия соединения.
"exec nohup setsid your_command"
nohup позволяет your_command продолжаться, даже если запущенный процесс может завершиться первым. Если это так, сигнал SIGNUP будет отправлен на your_command, что приведет к его прекращению (если только он не перехватит этот сигнал и не проигнорирует его).
В Windows вы можете использовать COM-объект:
if(class_exists('COM')) {
$shell = new COM('WScript.Shell');
$shell->Run($cmd, 1, false);
}
else {
exec('nohup ' . $cmd . ' 2>&1 &');
}