PHP exec () в качестве фонового процесса (среда Windows Wampserver) - PullRequest
25 голосов
/ 20 марта 2011

Я пытаюсь настроить файл запуска 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 и не ждал, пока он завершится.


EDIT

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

$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);

Ответы [ 6 ]

25 голосов
/ 20 марта 2011

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

$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);
9 голосов
/ 12 апреля 2013

Попытка добиться того же на сервере 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

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

4 голосов
/ 20 марта 2011

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

Примечание:

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

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

3 голосов
/ 20 марта 2011

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

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

1 голос
/ 01 октября 2011

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

0 голосов
/ 16 августа 2017

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

pclose(popen("start /B ". $cmd, "w"));
...