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

时间:2009-09-10 03:20:29

标签: php windows

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

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

<?php exec ("echo hello > hello.txt");?> 

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

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

<?php exec ("explorer");?>

什么都不做。或系统相同

3 个答案:

答案 0 :(得分: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服务器时,这不太实用。这个说明可能与我的用例非常具体,但我想把它放在这里以防万一我可以在将来拯救别人的挫折感。

答案 1 :(得分:18)

另一个超级迟到的答案,但在搜索&#34; php run gui program&#34; ...

时会出现在Google上

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

答案 2 :(得分:5)

您期待什么行为?调用system('notepad')工作正常 - 它只是不显示GUI。它在后台运行,PHP耐心等待记事本关闭(只有从进程列表中删除记事本才会继续)。

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