如何启动一个外部程序运行 – 系统和exec有问题
我运行在一个受控的,xp,仅限Intranet的环境中,我需要从PHP应用程序启动外部进程。 (备份,报告等)
我可以让system或exec启动默默工作的进程。 这是一个简单的例子
<?php exec ("echo hello > hello.txt");?>
我可以让它执行一个没有可见输出的bat文件。
我不能得到任何有运行屏幕的程序,如报告生成器或记事本…
<?php exec ("explorer");?>
什么都不做 或系统相同
你期待什么样的行为? 调用system('notepad')
工作正常 – 它只是不显示GUI。 它运行在后台,PHP坐在那里耐心地等待记事本closures自己(只有当你从进程列表中杀死记事本)。
如果你期望它popup一个graphics用户界面,我相当肯定,你不能这样做。 ;)一个选项可能是写出一个批处理脚本( file_put_contents('runme.bat', 'notepad hello.txt')
)并将该批处理脚本排队(使用Windows调度程序或任何与Windows相同的cron)到以asynchronous方式运行(并在最后清除自己)。
答案很晚,但是我正在自己研究这个问题,发现在Windows XP上使用Apache服务器从PHP运行GUI程序确实是可能的。
- 开始 – >运行,键入“services.msc”调出服务控制(其他方式到达那里,这是最简单的国际海事组织)
- find你的Apache服务(我的WampServer 2.0被称为“wampapache”)
- 打开服务属性(双击或右键单击 – >属性)
- 翻转到login帐户,并确保选中标题为“允许服务与桌面交互” checkbox
- 翻回到常规选项卡,停止服务,启动服务
现在,使用下面的代码,你可以从PHP产生UI进程。 在第一个代码片段中,脚本不会等待应用程序closures; 第二个片段在继续(阻塞)之前等待程序closures。
不要等待申请:
pclose(popen("start /B notepad.exe", "r"));
等待申请:
system('start notepad.exe');
这已经在Windows XP上testing过了。 我还没有尝试过任何其他Windows版本,你的米勒可能会有所不同。
注意事项在我的特定安装中,我使用服务的“login”选项卡中的其他选项 – Apache以域用户身份运行,因此可以使用域用户权限访问多个networking共享。 仅当服务以本地系统运行时,该checkbox才可用于该选项。 经过广泛研究后,我发现单一服务无法同时与当前桌面进行交互,也无法利用特定用户的凭据。 这是一个独一无二的build议,build议的补救办法是将您的服务分成两个组件 – 一个使用用户帐户privs和一个与桌面交互的组件。 当你正在谈论的服务是Web服务器时,不太实际。 这个笔记可能对我的用例非常具体,但是我想把它放在这里,以便在未来可以把别人的挫折保存下来。
另一个超级迟到的答案,但这在Googlesearch“php运行gui程序”时出现…
我已经能够通过制作,运行和删除计划任务在Windows 8.1中启动GUI应用程序:
shell_exec('SCHTASKS /F /Create /TN _notepad /TR "notepad.exe" /SC DAILY /RU INTERACTIVE'); shell_exec('SCHTASKS /RUN /TN "_notepad"'); shell_exec('SCHTASKS /DELETE /TN "_notepad" /F');