Команда php exec (или аналогичная), чтобы не ждать результата - PullRequest
64 голосов
/ 29 сентября 2010

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

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

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

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

Ответы [ 5 ]

102 голосов
/ 29 сентября 2010

Из документации :

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

> /dev/null 2>&1 &

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

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

45 голосов
/ 29 сентября 2010

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

exec('run_baby_run &');

Но выполнение этого само по себе приведет к зависанию сценария, потому что:

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

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

exec('run_baby_run > /dev/null &');
7 голосов
/ 02 августа 2014

Используется 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);
0 голосов
/ 08 ноября 2018

Существует два возможных способа его реализации. Самый простой способ - прямой результат для dev / null

exec("run_baby_run > /dev/null 2>&1 &");

Но если вам нужно выполнить какие-либо другие операции, вы можете рассмотреть ignore_user_abort В этом случае скрипт будет работать даже после закрытия соединения.

0 голосов
/ 06 марта 2014

"exec nohup setsid your_command"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...