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");
РЕДАКТИРОВАТЬ: Оказывается, мне не нужно убивать процесс
5 ответов
Поможет ли эта функция из Руководства по 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");
}
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
На моих машинах с Windows 10 и Windows Server 2012 единственное решение, которое надежно работало в pclose/popen, - это запуск команды powershell Start-Process, например:
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'));
Из руководства по PHP для exec
:
Если программа запускается с этой функцией, чтобы она продолжала работать в фоновом режиме, выходные данные программы должны быть перенаправлены в файл или другой поток вывода. В противном случае PHP будет зависать до тех пор, пока не закончится выполнение программы.
то есть направить вывод в файл и php не будет его ждать:
exec('myprog > output.txt');
По памяти, я считаю, что есть контрольный символ, который вы можете добавить (как вы делаете с @) к exec
семейство команд, которое также предотвращает приостановку выполнения - не могу вспомнить, что это такое.
Править Найдено это! В Unix программы, выполняемые с & prepended, будут работать в фоновом режиме. Извини, тебе не очень помогает.