it-swarm.com.ru

команда php exec (или аналогичная), чтобы не ждать результата

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

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

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

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

58
greg

Это всегда хорошо проверить документацию :

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

> /dev/null 2>&1 &

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

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

98
Cristian

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

exec('run_baby_run &');

Но выполнение этого в одиночку повесит ваш скрипт, потому что:

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

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

exec('run_baby_run > /dev/null &');
44
codaddict

Это использует 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);
7
Paul T

"exec Nohup setsid your_command"

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

0
jobeard

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

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

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

0
Aleksandr Ryabov