2009-06-02 137 views
0

我试图让PHP调用一个批处理文件,它将采用RTF文件并使用OpenOffice宏将其转换为PDF格式。我已经在命令行上测试了批处理文件,它工作正常,但我没有任何运气调用并使用PHP中的同一批处理文件。使用PHP exec命令执行批处理文件的问题

我的机器操作系统是XP专业SP 3.我运行IIS 6和PHP版本5.2.9。 我已授予c:\ windows \ system32 \ cmd.exe上的Internet用户执行权限。 我指定了正在执行的批处理文件的完整路径以及要转换的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文件没有被转换,我没有看到错误。关于我可以尝试下一步的任何想法?谢谢!!!

+0

你能列出你的批处理文件吗? – cdonner 2009-06-02 17:28:04

回答

0

PHP是否在安全模式下运行?如果是这样,shell命令将以escapeshellcmd转义。也许这是问题?

您是否拥有运行PHP脚本的服务器的控制权?

1

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

此外,escapeshellcmd和escapeshellarg应您正在使用IIS作为您的网络服务器使用

1

?如果是这样,那么PHP exec函数默认不起作用,您不应该绕过阻止其运行的安全措施。

检查你的事件查看器,你会发现一些与你的问题有关的错误。通过google运行一个查询:IIS PHP exec。这应该给你一个关于这个问题的大量信息。

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

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

这是一个肯定的混乱。