使用PHP exec命令执行批处理文件时出现问题

时间:2009-06-02 17:17:33

标签: php exec openoffice.org

我正在尝试让PHP调用批处理文件,该文件将采用RTF文件并使用OpenOffice宏将其转换为PDF。我已经在命令行上测试了批处理文件,它工作正常,但我没有运气和PHP使用相同的批处理文件。

我的机器操作系统是XP专业版SP 3.我正在运行IIS 6和PHP版本5.2.9。 我已经在c:\ windows \ system32 \ cmd.exe上为互联网用户授予了执行权限。 我指定了正在执行的批处理文件的完整路径以及要转换的RTF文件的完整路径。

PHP看起来像这样,其中$ arg是要转换的RTF:

$arg = "C:\\web_root\\whatever\\tempOutput.rtf";
$command = "c:\\windows\\system32\\cmd.exe /c c:\\web_root\\whatever\\convert.bat $arg";

然后在try-catch中调用exec命令:

exec("$command 2>&1 && exit", $ret, $err);

我在捕获后回显结果:

echo "ret: ";
print_r ($ret);
print "<br>";
echo "err is ";
echo $err;
print "<br>";
echo "DONE!";

这就是我所看到的:

ret: Array ( ) 
err is 0
DONE!

RTF文件没有转换,我没有看到错误。关于我接下来可以尝试的任何想法?感谢!!!

4 个答案:

答案 0 :(得分:1)

我打赌这是关于权限的。

在典型的设置中,PHP以apache运行 - 因此您需要确保apache有权执行批处理文件。

另外,请检查this relevant SO questionthis google search

答案 1 :(得分:1)

看起来输出数组是空的。您的批处理脚本是否应该有输出?

此外,应使用escapeshellcmd和escapeshellarg

答案 2 :(得分:1)

您使用IIS作为网络服务器吗?如果是这样,PHP exec函数默认不起作用,你不应该绕过阻止它运行的安全措施。

检查您的事件查看器,您应该找到与您的问题有关的一些错误。通过谷歌运行查询:IIS PHP exec。这应该为您提供有关该问题的大量信息。

基本上,PHP exec函数尝试派生新的cmd.exe实例。 IIS禁止这样做,因为它可能会在系统中打开一个安全漏洞。

我提出的最佳解决方案是让您的php脚本将要执行的命令写入平面文件或创建数据库条目。然后,您需要编写一个由Windows调度程序启动的单独脚本,每10分钟左右运行一次,以检查您的平面文件或数据库以查找要运行的命令。然后,新脚本将运行命令,然后放置结果或您的Web应用程序稍后将能够访问的执行确认。

这肯定是一个蠢货。

答案 3 :(得分:0)

PHP是否以安全模式运行?如果是,则使用escapeshellcmd转义shell命令。也许这就是问题?

您是否可以控制运行PHP脚本的服务器?