it-swarm.com.ru

PHP exec () в качестве фонового процесса (среда Windows Wampserver)

Я пытаюсь настроить файл запуска php, который будет запускать фоновый процесс. (см. этот вопрос )

Я делаю это в среде Windows Wampserver.

Так, например, у меня есть trigger.php, который запускает функцию exec, которая вызывает мой backgroundProcess.php для анализа и выполнения.

Однако проблема в том, что мой файл trigger.php ожидает, пока команда exec() завершит выполнение backgroundProcess.php, прежде чем она остановится. Фоновый процесс длится около 20-30 секунд, и trigger.php все это время ожидает, пока backgroundProcess.php не завершится полностью.

Это имеет смысл? Вот файл trigger.php, который запускает команду exec()

exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');

По сути, я хочу, чтобы trigger.php просто запускал backgroundProcess и не ждал, пока он завершится.


ПРАВКА

Проблема решена с помощью следующей команды:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
25
Emmanuel

Проблема решена с помощью следующей команды:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);
24
Emmanuel

Попытка добиться того же на сервере Windows 2000 с PHP 5.2.8.

Ни одно из решений не сработало для меня. PHP продолжал ждать ответа.

Нашел решение, чтобы быть:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php";
pclose(popen("start /B ". $cmd, "a"));  // mode = "a" since I had some logs to edit

ps: Публикация того же ответа в другом потоке ( PHP на компьютере с Windows; запуск процесса в фоновом режиме ), так как эти две ссылки очень помогли мне провести некоторые исследования по этому вопросу.

9
Rohit

Из руководства: http://www.php.net/manual/en/function.exec.php

Замечания:

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

И на тот же вопрос, на который я ответил: Вызвать другой скрипт PHP и вернуть управление пользователю до завершения работы другого скрипта

4
JohnP

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

Для таких задач обычно лучше поставить задачу в очередь, в идеале, в базу данных, и периодически их обрабатывать. В системах на базе Linux есть хронологические задания. В Windows вы можете использовать планировщик для запуска backgroundProcess.php.

3
Shamim Hafiz

Вполне возможно, что при использовании exec() в среде Windows это перенаправление на NUL:. /dev/null является * nix пустым файлом.

1
John

В дополнение к ответу Рохита выше я отредактировал его решение для работы в Windows 10 PHP 7.0.3:

pclose(popen("start /B ". $cmd, "w"));
0
William N Irwin