从PHP文件调用Windows程序(通过命令提示符)

从PHP文件调用Windows程序(通过命令提示符),php,windows,command-prompt,Php,Windows,Command Prompt,我尝试了几种方法调用windows程序,每次都得到了相同的结果 程序在我的机器上打开(没有GUI),但从不关闭,这意味着浏览器永远在加载 但是,当通过命令行提示符手动执行查询字符串时,程序将关闭。不仅如此,程序实际上并没有执行 (它刚刚推出,即没有任何结果) 我只是想知道通过PHP用开关启动程序的正确方法 以下是有效的查询字符串(执行后关闭程序): 如果程序从未关闭,则PHP无法从exec()返回值。程序必须关闭。以这种方式访问桌面上的文件可能会出现问题。它将以Web服务器定义的任何权限执行

我尝试了几种方法调用windows程序,每次都得到了相同的结果

程序在我的机器上打开(没有GUI),但从不关闭,这意味着浏览器永远在加载

但是,当通过命令行提示符手动执行查询字符串时,程序将关闭。不仅如此,程序实际上并没有执行

(它刚刚推出,即没有任何结果)

我只是想知道通过PHP用开关启动程序的正确方法

以下是有效的查询字符串(执行后关闭程序):


如果程序从未关闭,则PHP无法从
exec()
返回值。程序必须关闭。以这种方式访问桌面上的文件可能会出现问题。它将以Web服务器定义的任何权限执行


您可以考虑高级功能。它将允许您访问所有必要的管道,但我认为这对您在这种情况下没有帮助。

如果Windows计算机上的目标目录是C:\Program Files(x86)\Softinterface,Inc\Convert PowerPoint\ConvertPPT.exe,则需要对其中包含空格字符的目录进行双引号

要将其转换为php术语,应如下所示:

$directory = 'C:\"Program Files (x86)"\"Softinterface, Inc"\"Convert PowerPoint"\ConvertPPT.exe';

$command = $directory . ' enter your arguments here';

exec($command, $output, $return_var);

// if $return_var == 0, you hit the jackpot.

存储Windows桌面的物理目录属于用户配置文件文件夹。这意味着其他用户(包括Apache作为运行的用户,这是典型的“本地系统”)将没有相应的权限在其上读写文件。虽然您可以调整Apache设置,使其与您自己的用户(
Farzad
)一起运行,但将web应用程序放在完全不同的目录树中更为常见。ConvertPPT.exe可能只是暂停,因为它试图在不允许的位置写入文件。我建议您创建一个顶级文件夹目录,并确保它是全世界可写的(一旦完成,如果您愿意,您可以收紧这些权限)

一旦您放弃(或确认)该问题是由于缺少适当的凭据造成的,请确保您正确地转义了命令和参数。请参阅此链接:

您还可以尝试在发出exec()调用之前关闭PHP会话:


您可能遇到了以下错误:

在PHP5.3.5上,这个问题困扰了我很多年,直到今天

程序的错误输出和apache错误日志文件句柄之间似乎存在某种死锁,程序被重定向到该文件句柄中以写入其stderr输出,从而使程序永远被卡住,直到apache进程被终止

另外,当使用
passthru
、或
system
或backtick操作符时,有一个中间的“cmd.exe”进程用于在一个不可见的控制台中运行程序,我看到这个cmd进程甚至没有运行程序就被卡住了


到目前为止,我还没有一个真正的解决方案,而且这个bug似乎还没有被解决,即使它被许多人复制。

那么这是否意味着我应该向任何人授予.exe文件的读/写和执行权限?不,你最好配置你的web服务器(我假设是IIS?)以特定用户身份运行此脚本,并授予该用户帐户访问权限。我使用本地主机作为我的web服务器(WAMP)来测试itSo,然后使用Apache。你把它当作服务来运行?您可以修改服务属性以作为其他用户运行。请参阅,您也可以尝试以自己的身份运行Apache(手动启动httpd.exe)进行测试。您应该首先尝试将数据文件移到配置文件之外(例如,创建
C:\test
目录)以放弃权限问题。@Alvaro,这不一定能解决问题。@Brad,故障排除需要有条理。您不能一次随机测试所有内容。@Alvaro,我只是指出,将所有内容移出配置文件不会排除权限问题。当然,这应该是第一件要检查的事情之一,但他最好尝试使用适当的权限。@Brad,Windows用户配置文件仅限于其所有者:使用默认设置,Apache将永远无法写入这些用户配置文件。但是,这可能毕竟不是权限问题。我认为在另一个文件夹中进行测试(需要30秒并且没有副作用)比重新配置(可能是错误配置)开发环境更容易。我认为你是错误的。看见您不需要(也不应该)在每个目录周围加双引号。只需在整个命令中添加一些,并且仅在PHP5.2及更高版本上。另外,我认为这不是问题所在,因为他说他可以看到程序运行。如果失败了,它不会阻止他的PHP代码。这与exec命令无关,而是与Windows本身有关,尤其是Windows XP(我没有使用W7或Vista进行PHP测试)。如果目录名称中有空格,请引用该目录并解决路径问题。如果不这样做,则尝试调用的程序将挂起。我通过反复试验找到了解决方案,它在我的特殊情况下确实有效,所以我与OP分享了它。
$directory = 'C:\"Program Files (x86)"\"Softinterface, Inc"\"Convert PowerPoint"\ConvertPPT.exe';

$command = $directory . ' enter your arguments here';

exec($command, $output, $return_var);

// if $return_var == 0, you hit the jackpot.