Я пытаюсь установить файл запуска 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
просто 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);
Проблема решена с помощью следующей команды:
$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);
Пытался добиться того же самого на сервере 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 ссылки помогли мне много сделать некоторые исследования по этому вопросу.
Из руководства: http://www.php.net/manual/en/function.exec.php
Заметка:
Если программа запускается с этой функцией, чтобы она продолжала работать в фоновом режиме, выход программы должен быть перенаправлен в файл или другой выходной поток. В противном случае PHP зависнет до завершения программы.
И аналогичный вопрос, на который я ответил: вызовите еще один PHP-скрипт и верните управление пользователю до того, как завершится другой скрипт
Возможно, вам придется изменить свой подход к внедрению. Подождать так долго было бы досадой для пользователя вашего приложения и фатальным для всего приложения.
Для таких задач обычно лучше ставить очередь задачи, в идеале на базу данных, и обрабатывать их периодически. В системах на базе Linux есть хронологические задания. В Windows вы можете использовать планировщик для запуска backgroundProcess.php.
Вполне возможно, что при использовании exec()
в среде Windows перенаправление на NUL:
/dev/null
– это нулевой файл * nix.
В дополнение к ответу Rohit выше, я отредактировал его решение для работы с Windows 10 PHP 7.0.3:
pclose(popen("start /B ". $cmd, "w"));