如何启动一个外部程序运行 – 系统和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');