如何在Windows IIS7环境的PHP 5.6.40中启动无需等待执行完成的进程?
如何在Windows IIS7环境的PHP 5.6.40中启动无需等待执行完成的进程?
我完全懂你的困扰——在Windows IIS环境下用PHP启动进程,哪怕加了start命令,还是会傻傻等着进程跑完,这和Linux下的操作逻辑确实差很多。我给你几个经过验证的解决办法,亲测在PHP 5.6.40 + IIS7的环境下有效:
方法一:用
popen()配合start /B后台运行
单纯的start命令在IIS的服务上下文里可能还是会让PHP等待,加上/B参数可以让进程在后台运行且不新开窗口,配合popen打开后立刻关闭句柄,就能让PHP直接返回:$handle = popen("start /B ping -n 3 127.0.0.1 > nul 2>&1", "r"); pclose($handle);这里的
> nul 2>&1是把标准输出和错误输出都丢弃,避免产生不必要的日志或阻塞。方法二:用
proc_open()精细控制进程proc_open是PHP里更灵活的进程控制函数,通过关闭所有管道和进程句柄,能彻底让PHP和子进程脱离关联:$descriptorspec = array( 0 => array("pipe", "r"), // 标准输入管道 1 => array("pipe", "w"), // 标准输出管道 2 => array("pipe", "w") // 标准错误管道 ); $process = proc_open("start /B ping -n 3 127.0.0.1 > nul 2>&1", $descriptorspec, $pipes); // 立刻关闭所有管道并释放进程资源,避免PHP等待 if (is_resource($process)) { foreach ($pipes as $pipe) { fclose($pipe); } proc_close($process); }方法三:借助VBScript实现完全后台运行
如果上面的方法还是不行,可以用VBScript来包装命令,因为WScript的Run方法支持直接设置不等待进程完成:
先创建一个run_background.vbs脚本,内容如下:Set WshShell = CreateObject("WScript.Shell") ' 第三个参数False表示不等待命令执行完成,第二个参数0表示隐藏窗口 WshShell.Run "ping -n 3 127.0.0.1 > nul 2>&1", 0, False然后在PHP里调用这个脚本:
exec("wscript.exe run_background.vbs > nul 2>&1");
至于你之前用的exec("start ping ...")为什么不行,主要是因为IIS下的PHP进程是在服务上下文运行的,没有交互式控制台,start命令的行为和普通桌面环境下不一样,导致PHP还是会等待子进程结束。上面的方法都是针对这个场景优化过的,应该能解决你的问题。
备注:内容来源于stack exchange,提问作者Barny
相关产品推荐
相关产品推荐

