如果我在PHP脚本中使用popen
在Windows中启动PHP守护程序,如何再次检查该脚本是否仍在从PHP脚本运行?
我使用Apache,php作为模块
更新: 处理它是以
开始的popen('start /b php process.php', 'r');
一旦在Windows中启动,就会启动php.exe进程。如果该进程仍在运行,如何从另一个PHP脚本中获取该进程PID以便稍后检查(它运行几个小时)?
我读了这个proc_open,它应该给出与proc_get_status
一起启动的过程的PID,但是我使用popen的那个命令没有任何反应
更新:我注意到使用相同的命令和proc_open一个php.exe进程确实启动但它在启动它的脚本结束并且proc_get_status返回的PID与Windows PID不对应之后关闭
答案 0 :(得分:2)
使用PHP和Windows安全运行进程有多种方法:
您可以使用WScript.Shell对象的Run
方法启动该过程,该方法是Windows内置的。通过改变第二个参数,可以使窗口隐藏,可见,最小化等。通过将第三个参数设置为false,Run不会等待进程完成执行。此代码仅适用于Windows。要了解有关COM的更多信息,请阅读PHP's documentation。
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /C dir /S %windir%", 0, false);
此代码应适用于Linux和Windows。
pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));
此方法需要安装免费软件pstools from sysinternals:
exec("psexec -d blah.bat");
通过阅读brief tutorial,您可以找到有关它的更多信息。我之前使用过第一种方法,它总是对我有效。
要查找现有流程的PID,我认为您不能使用getmypid
或posix_getpid
,因此您必须使用exec('tasklist');
。或者,您可以安装this extension并关注these instructions。
答案 1 :(得分:0)
使用php的系统()
和
使用cmd.exe:
任务列表
如果你有Powershell:
GET-过程
未经测试。或者使用winapi调用编写您的小型控制台应用程序