Windows 기계의 PHP; 백그라운드에서 프로세스를 시작하십시오
-
20-09-2019 - |
문제
나는 최선의 방법을 찾고 있거나 실제로 배경에서 PHP에서 프로세스를 시작하여 스크립트에서 나중에 죽일 수 있습니다.
지금은 다음을 사용하고 있습니다 : shell_exec ($ command); 이것의 문제는 프로그램이 닫히기를 기다린다는 것입니다.
나는 shell 명령을 실행할 때 nohup과 같은 효과를 갖는 것을 원합니다. 이렇게하면 백그라운드에서 프로세스를 실행할 수 있으므로 스크립트의 나중에 닫을 수 있습니다. 이 스크립트는 정기적으로 실행되며 이것이 실행될 때 프로그램을 열 수 없으므로 닫아야합니다.
백그라운드에서 명령을 실행하기 위해 .BAT 파일을 생성 할 생각이지만 나중에 프로세스를 어떻게 죽일 수 있습니까?
내가 Linux에서 본 코드는 다음과 같습니다.
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
// Later on to kill it
exec("kill -KILL $PID");
편집하다: 프로세스를 죽일 필요가 없다는 것이 밝혀졌습니다.
해결책
이게 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
매개 변수는 여기에서 핵심입니다.
더 이상 이것을 찾은 곳을 찾을 수없는 것 같습니다. 그러나 이것은 나를 위해 작동합니다.
PHP 5.2.8이있는 Windows 2000 서버에서 동일하게 달성하려고했습니다.
솔루션 중 어느 것도 저에게 효과가 없었습니다. 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에서 실행 및 선불 프로그램이 백그라운드에서 실행됩니다. 죄송합니다. 많은 도움이되지 않습니다.
Windows 10 및 Windows Server 2012 머신에서 PCLOSE/POPEN 내에서 안정적으로 작동 한 유일한 솔루션은 다음과 같이 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'));