PHP Exec无法运行,但命令可以正常工作!

3
我有以下PHP脚本,可以将上传的PDF文件通过ImageMagik/Ghostscript转换为指定大小的图像。
$tmp = exec("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"", $results); 

然而,这似乎不起作用。日志文件中没有错误,屏幕上也没有错误。如果我执行以下操作:

$tmp = exec("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"", $results); 
echo ("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"");

当我将输出粘贴到命令提示符中时,它可以正常工作(需要大约6-10秒 - 我的max_execution_time为600)。

有什么建议可能导致这不起作用吗?

这是Windows、IIS 7和PHP5。

编辑:我在CentOS和Windows都遇到了同样的问题。两者都安装了ImageMagik和Ghostscript。

编辑 编辑下面仍然失败。

$handle = popen("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"","r");
        echo "'$handle'; " . gettype($handle) . "\n";
        $read = fread($handle, 2096);
        echo $read;
        pclose($handle);

1
将变量直接放在命令行中是自找麻烦。CLI注入SQL注入一样危险,甚至更加危险。请使用escapeshellarg()函数。 - Andrew Moore
@Andrew 已经注意到您的评论,谢谢。 - LiamB
尝试使用 popen 而非 exec,并通过 fgets 读取输出。 - Milan Babuškov
@Milan Babuškov 同样的问题。 :( 已更新主贴并附上代码。 - LiamB
$strPDF或$strOut包含空格吗? - Milan Babuškov
3个回答

10

尝试在您的命令末尾添加2>&1。我在这里找到了它。

exec('some_command 2>&1', $output);
print_r($output);  // to see the respond to your command

3
在php.ini中,可能会在此函数exec之下声明。
disable_functions

或者,如果你在

安全模式

运行PHP时,此函数将被禁用。安全模式


(safe_mode = Off 和 disable_functions = )所以看起来不是那个问题。 - LiamB
可能是该文件或目录的权限问题。 - Haim Evgi

1

这可能与您的PATH变量有关吗?

您可以尝试运行

<?php
echo exec('cmd.exe /c echo %path%');
?>

无论是在命令行还是从IIS中,比较它们的输出结果。

在这种情况下,尝试使用绝对路径可能会有所帮助(特别是如果连“cmd.exe”也无法执行)。 - Arc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接