PHP на машине Windows; Начать процесс в фоновом режиме

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

Прямо сейчас, я использую: shell_exec ($ Command); Проблема заключается в том, что она ждет закрытия программы.

Я хочу что-то, что будет иметь тот же эффект, что и nohup при выполнении команды оболочки. Это позволит мне запустить процесс в фоновом режиме, так что позже в скрипте он может быть закрыт. Мне нужно закрыть его, потому что этот скрипт будет запускаться на регулярной основе, и программа не может быть открыта, когда это выполняется.

Я думал о создании .bat-файла для запуска команды в фоновом режиме, но даже тогда, как я могу убить процесс позже?

Код, который я видел для linux:

$PID = shell_exec("nohup $Command > /dev/null & echo $!"); // Later on to kill it exec("kill -KILL $PID"); 

EDIT : Оказывается, мне не нужно убивать процесс

Solutions Collecting From Web of "PHP на машине Windows; Начать процесс в фоновом режиме"

Будет ли эта функция из справочника PHP ?

 function runAsynchronously($path,$arguments) { $WshShell = new COM("WScript.Shell"); $oShellLink = $WshShell->CreateShortcut("temp.lnk"); $oShellLink->TargetPath = $path; $oShellLink->Arguments = $arguments; $oShellLink->WorkingDirectory = dirname($path); $oShellLink->WindowStyle = 1; $oShellLink->Save(); $oExec = $WshShell->Run("temp.lnk", 7, false); unset($WshShell,$oShellLink,$oExec); unlink("temp.lnk"); } с function runAsynchronously($path,$arguments) { $WshShell = new COM("WScript.Shell"); $oShellLink = $WshShell->CreateShortcut("temp.lnk"); $oShellLink->TargetPath = $path; $oShellLink->Arguments = $arguments; $oShellLink->WorkingDirectory = dirname($path); $oShellLink->WindowStyle = 1; $oShellLink->Save(); $oExec = $WshShell->Run("temp.lnk", 7, false); unset($WshShell,$oShellLink,$oExec); unlink("temp.lnk"); } 

shell_exec('start /B "C:\Path\to\program.exe"');

Здесь параметр /B

Кажется, я не могу найти, где я нашел это больше. Но это работает для меня.

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

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

т.е. вывести вывод в файл, и php не будет ждать его:

 exec('myprog > output.txt'); 

Из памяти я считаю, что есть контрольный символ, который вы можете добавить (например, с @) к семейству команд exec которое также предотвращает выполнение паузы – не помню, что это такое.

Редактировать Нашли это! В unix программы, выполняемые с & prepended, будут работать в фоновом режиме. Извините, вам не очень помогает.

На моих машинах Windows 10 и Windows Server 2012 единственное решение, которое надежно работало в pclose / popen, состояло в том, чтобы вызвать команду Start-Process powershell, как в:

 pclose(popen('powershell.exe "Start-Process foo.bat -WindowStyle Hidden"','r')); 

Или более подробно, если вы хотите предоставить аргументы и перенаправить выходы:

 pclose(popen('powershell.exe "Start-Process foo.bat -ArgumentList \'bar\',\'bat\' -WindowStyle Hidden -RedirectStandardOutput \'.\\console.out\' -RedirectStandardError \'.\\console.err\'"','r'));