php如何启动外部程序运行 - 遇到系统和执行错误

sdf*_*for 12 php windows

我正在一个受控的,仅限xp,仅限Intranet的环境中运行,我需要从PHP应用程序启动外部进程.(备份,报告等)

我可以让系统或exec启动静默工作的进程.这是一个简单的例子

<?php exec ("echo hello > hello.txt");?> 
Run Code Online (Sandbox Code Playgroud)

我可以让它执行一个没有可见输出的bat文件.

我无法获得任何具有运行屏幕的程序,例如报告生成器或记事本......

<?php exec ("explorer");?>
Run Code Online (Sandbox Code Playgroud)

什么都不做 或系统相同

Chr*_*ker 18

很晚的回答,但我自己正在研究这个问题,并发现在Windows XP上使用Apache服务器运行PHP程序确实是可行的.

  • 单击开始 - >运行,键入"services.msc"以启动服务控制(其他方式到达那里,这是最简单的IMO)
  • 找到你的Apache服务(我的使用WampServer 2.0称为"wampapache")
  • 打开服务属性(双击或右键单击 - >属性)
  • 转到登录帐户并确保选中标题为"允许服务与桌面交互"的复选框
  • 返回"常规"选项卡,停止服务,启动服务

现在,使用下面的代码,您可以从PHP生成UI进程.在第一个代码段中,脚本不会等待应用程序关闭; 第二个片段在继续(阻止)之前等待程序关闭.

不要等待申请:

pclose(popen("start /B notepad.exe", "r"));

等待申请:

system('start notepad.exe');

这已在Windows XP上测试过.我没有在任何其他Windows版本上试过它,你的millage可能会有所不同.

附注 在我的特定安装中,我使用了服务的"登录"选项卡中的另一个选项--Apache作为域用户运行,因此它可以使用域用户权限访问多个网络共享.仅当该服务作为本地系统运行时,该选项才可用该复选框.经过广泛的研究,我发现单个服务根本无法与当前桌面交互并利用特定用户的凭据.这是一个或另一个命题,建议的补救措施是将您的服务拆分为两个组件 - 一个使用用户帐户privs,另一个使用与桌面交互.当您谈论的服务是Web服务器时,这不太实用.这个说明可能与我的用例非常具体,但我想把它放在这里,以防万一我可以在将来拯救别人的挫折感.

  • 我很好奇这是如何得到10个upvotes - 它仍然只运行记事本作为我的设置的后台进程,即使我有"与桌面交互".我正在使用Windows 7. (2认同)

jxm*_*ett 18

另一个超级迟到的答案,但在搜索"php run gui program"时谷歌出现了......

我已经能够通过制作,运行和删除计划任务在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');
Run Code Online (Sandbox Code Playgroud)


小智 5

您期望什么行为?调用system('notepad')工作正常-只是不显示GUI。它在后台运行,PHP耐心地坐在那里等待记事本自身关闭(并且仅当您从进程列表中杀死记事本时才继续)。

如果您期望它弹出GUI,那么我可以肯定您不能这样做。;)的一种选择是写出一个批处理脚本(file_put_contents('runme.bat', 'notepad hello.txt')),并使该批处理脚本排队(使用Windows调度程序或Windows上与cron等效的任何程序),以异步方式运行(并在最后清除自身)。