Php exec без ожидания ответа

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

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

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

Решение

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

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

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

Другие решения

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

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

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

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

Это использует wget для уведомления URL-адреса чего-либо без ожидания.

Это использует ls для обновления журнала без ожидания.

«Exec поЬир setsid your_command «

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

Читайте также:  Smart tv приставка днс

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

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

При выполнении получается так что скрипт ожидает пока исполнится другой запущенный этой командой скрипт.Как сделать так чтобы клиент не ждал скрипта и получил известие что скрипт выполняется.

1 ответ 1

Пишу свое решение. Есть некоторые неточности, поправьте.

Работает только под Linux, запускать для Windows нужно по-другому (этого я и не учёл).

Шаблон для запуска чего-то в фоне :(спасибо ВОРОНУ)

exec(‘some_command > /dev/null 2>&1 &’) — где /dev/null выкидывает в мусорку,а говорит & о работе в фоне

Для запуска файла в фоне нужно сделать так:

exec(‘php -f путь где находится скрипт > /dev/null 2>&1 &’)

Добрый день
со страницы отправляется ajax запрос, на стороне сервера запускается из php команда, пусть будет ping
exec(‘ping 1.1.1.1 -c 100 >buffer &’);

План построчно при помощи ajax читать файл вывода команды и отдавать пользователю. Но не смотря на то что в конце команды стоит ‘&’. все равно php ждет когда команда выполнится полностью и на это время ‘зависает’. Как это победить? я не большой специалист в linux

  • Вопрос задан более трёх лет назад
  • 1523 просмотра

Запускайте команду асинхронно.

Дмитрий: не надо руками.
И ларавел гораздо удобнее ставится из композера. Как вы его обновлять собираетесь, если руками ставить будете?

OnYourLips: вот что composer говорит при попытке установить
Your requirements could not be resolved to an installable set of packages.

Problem 1
— laravel/framework v5.3.29 requires symfony/process 3.1.* -> satisfiable by symfony/process[3.1.x-dev, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8] but these conflict with your requirements or minimum-stability.
— laravel/framework v5.3.29 requires symfony/process 3.1.* -> satisfiable by symfony/process[3.1.x-dev, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8] but these conflict with your requirements or minimum-stability.
— laravel/framework v5.3.29 requires symfony/process 3.1.* -> satisfiable by symfony/process[3.1.x-dev, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8] but these conflict with your requirements or minimum-stability.
— Installation request for laravel/framework (locked at v5.3.29, required as 5.3.*) -> satisfiable by laravel/framework[v5.3.29].

Читайте также:  Sony bravia oled цена

Installation failed, reverting ./composer.json to its original content.

спасибо установил.
но все равно садомия какаято ) поставил, пробую
public function runCurrent()
<
$process = new Process(‘ping 8.8.8.8 -c 10’);
$process->start();

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *