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

Я пытаюсь настроить файл триггера 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);

Ответ 1

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

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

Ответ 2

Пытался добиться того же самого на сервере 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, запуск процесса в фоновом режиме), так как эти 2 ссылки помогли мне много сделать некоторые исследования по этому вопросу.

Ответ 3

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

Примечание:

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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