1

如果我在 Windows 中使用 PHP 脚本启动 PHP 守护程序,popen如果该脚本仍在从 PHP 脚本运行,我该如何再次签入?

我用 Apache,php 作为模块

更新:它开始的过程

popen('start /b php process.php', 'r');

一旦它在 Windows 中启动,就会启动一个 php.exe 进程。如果该进程仍在运行,我如何让该进程 PID 稍后从另一个 PHP 脚本检查(它运行数小时)?

我读了这个proc_open,它应该给出启动进程的PID,proc_get_status 但是使用与popen一起使用的相同命令没有任何反应

更新:我注意到使用相同的命令和 proc_open 一个 php.exe 进程确实启动了,但它在启动它的脚本结束后关闭,并且 proc_get_status 返回的 PID 与 Windows PID 不对应

4

2 回答 2

2

有几种使用 PHP 和 Windows 安全运行进程的方法:

1. 使用 WScript.Shell 对象启动后台进程

您可以使用RunWindows 内置的 WScript.Shell 对象的方法启动该过程。通过改变第二个参数,您可以使窗口隐藏、可见、最小化等。通过将第三个参数设置为 false,Run 不会等待进程完成执行。此代码仅适用于 Windows。要了解有关 COM 的更多信息,请阅读PHP 的文档

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /C dir /S %windir%", 0, false);

2.使用popen和pclose启动后台进程

这段代码应该可以在 Linux 和 Windows 上运行。

pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));

3.用psexec启动后台进程

此方法需要从 sysinternals 安装免费软件 pstools

exec("psexec -d blah.bat"); 

您可以通过阅读这个简短的教程来了解有关它的更多信息。我以前用过第一种方法,它总是对我有用。


要查找现有进程的 PID,我认为您不能使用getmypidposix_getpid因此您必须使用exec('tasklist');. 或者,您可以安装此扩展程序并按照这些说明进行操作。

于 2012-04-08T22:06:26.653 回答
0

使用来自 php 的 system()

使用 cmd.exe:

任务列表

如果你有 Powershell:

获取过程

未测试。或者使用 winapi 调用编写您的小型控制台应用程序

于 2012-04-08T22:11:23.627 回答