Команда 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 &');
}
Другие вопросы по тегам