ImageMagick转换可以在命令行中工作,但不能通过PHP exec()


ImageMagick convert works in commandline, but not via PHP exec()

我使用PHP的exec()来使用ImagicMagick的convert转换图像。这是在一个CentOS服务器上运行的。

exec(convert http://www.google.com/images/srpr/logo3w.png.jpg 
    -resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg);

使用exec()不会导致新图像出现在目标文件夹中。然而,如果我在shell中运行相同的命令,它会完美地工作!

我认为这是一个PATH问题。如果是,我如何检查PHP正在使用的路径,以及如何在PHP中设置正确的路径?

function execute($command)
{
    # remove newlines and convert single quotes to double to prevent errors
    $command = str_replace(array("'n", "'"), array('', '"'), $command);
    # replace multiple spaces with one
    $command = preg_replace('#('s){2,}#is', ' ', $command);
    # escape shell metacharacters
    $command = escapeshellcmd($command);
    # execute convert program
    return shell_exec($command); // or whatever you like
}

首先,您应该尝试使用一个确实存在并可检索的输入文件:

wgethttp://www.google.com/images/srpr/logo3w.png.jpg--2012-08-21 20:55:24-http://www.google.com/images/srpr/logo3w.png.jpg正在解析www.google.com(www.google.com)…173.1943.5179173.1943.5177173.1943.5178。。。正在连接到www.google.com(www.google.com)|173.194.35.179|:80…已连接。HTTP请求已发送,正在等待响应。。。404未找到2012-08-21 20:55:24错误404:找不到。

然后,查看您的PHP使用哪个convert

exec(which convert 2>/tmp/whichconvert.2 1>whichconvert.1)

cat /tmp/whichconvert.{1,2}

最后,还尝试使用convert:的完整路径

exec(/usr/local/full/path/to/convert logo: 
-resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg);

然后

identify /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg

更新:

您想要检索的文件可能不是logo3w.png.jpg,而是logo3w.png:

wgethttp://www.google.com/images/srpr/logo3w.png--2012-08-21 21:04:22-http://www.google.com/images/srpr/logo3w.png正在解析www.google.com(www.google.com)…173.194.35.180、173.194.35.177、173.1943.5.179、。。。正在连接到www.google.com(www.google.com)| 173.194.35.180 |:80…已连接。HTTP请求已发送,正在等待响应。。。200 OK长度:7007(6.8K)[image/png]保存到:'logo3w.png'100%================================================>]7007--K/s,0.02秒2012-08-21 21:04:22(451 KB/s)-已保存"logo3w.png"[7007/7007]

此外,如果它只适用于本地文件(而不是远程http URI),您可能需要检查convert使用的http委托是否确实安装在您的系统上:

convert -list delegate | grep http
      https =>          "/opt/local/bin/curl" -s -k -o "%o" "https:%M"

此外,检查运行PHP的用户帐户是否确实有权写入目标目录:

exec(touch /home/mysite/public_html/public/img/posts/original/touchtest);

然后

ls -l  /home/mysite/public_html/public/img/posts/original/touchtest

对我有用的是提供了ImageMagick二进制文件的完整路径。使用/path/to/convert而不是convert

$command = $this->imageMagickFullBinaryPath . ' -resize ' . $dimensions . 
           ' ' . $imageFileToResize . ' ' . $resultingThumbnail; 
exec($command, $output);
相关文章: