如何在Windows上从PHP获得进程PID


How to get process PID from PHP on Windows

我正在开发一个基于web的应用程序,我需要运行Matlab脚本来处理一些信息。

问题是我对同时运行的Matlab进程的最大数量有限制,因此,我必须获得每个进程的PID,以便知道它们中的任何一个是否已经崩溃,以及它是哪一个。

我已经使用了一些方法来获得它的PID,但由于某种原因,运行一个简单的命令,如'notepad.exe'工作良好,并获得正确的PID,但当我运行我的脚本,它得到错误的PID。

我尝试过的方法之一是:

$process = "matlab";
$command = "-sd ".$softExecPath." -r '"analyse('".$videoDataPath."', '".$id_video_data."') '" ";
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->exec($process." ".$command);
$pid = intval($oExec->ProcessID);

另一个是:

$process = "matlab";
$command = "-sd ".$softExecPath." -r '"analyse('".$videoDataPath."', '".$id_video_data."') '" ";
$command = $process." ".$command;
// use psexec to start in background, pipe stderr to stdout to capture pid
exec("C:/AppServ/www/PsTools/psexec.exe -d -accepteula $command 2>&1", $output);
// capture pid on the 6th line
preg_match('/ID ('d+)/', $output[5], $matches);
$pid = $matches[1];

它们都得到一个PID,但没有一个是真实的。

在Windows上,您调用以启动Matlab的Matlab程序(如果添加它,则在开始菜单和路径中通过快捷方式指向的程序)只是一个启动程序,它继续运行另一个matlab.exe,这是实际的程序,然后立即返回。您返回的PID是启动程序的PID,当真正的Matlab工作时,它将消失。

您可以做两件事:您可以通过在Matlab安装下的bin/win32或类似的平台特定目录中找到它来直接运行实际的matlab.exe程序。然后你会得到正确的PID。或者您可以使用-wait选项使启动程序同步运行,这意味着它将阻塞,直到子matlab.exe退出,所以它仍然会出现在进程列表中,而Matlab正在运行。