【问题标题】:ImageMagick convert works in commandline, but not via PHP exec()ImageMagick convert 在命令行中工作,但不能通过 PHP exec()
【发布时间】:2012-08-21 18:49:26
【问题描述】:

我正在使用 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 中设置正确的路径?

【问题讨论】:

  • 很可能你的目标文件夹不能被任何运行你的 php.ini 文件所写。可能是某种 www 用户。
  • convert 是否在 PHP 将启动以运行命令的任何 shell 的路径中?一个简单的echo $PATH exec 会告诉你。
  • 哎呀,我在这里省略了引号,它肯定存在于我使用的实际代码中。目录的文件夹权限应该是什么? 777?目前是 755。更改文件夹的所有者/组会有所帮助,还是会搞砸?
  • 我在要让 Imagemagick 写入的文件夹上创建了 chmod 777,现在它可以与 exec() 一起使用。
  • 我也有同样的问题,但使用的是 liferay。适用于终端,但不适用于 liferay。

标签: php linux imagemagick centos


【解决方案1】:
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
}

【讨论】:

  • 哦!终于有人考虑逃避必要的做法了:-)
【解决方案2】:

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

wget http://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.194.35.179, 173.194.35.177, 173.194.35.178, ...
  正在连接到 www.google.com (www.google.com)|173.194.35.179|:80... 已连接。
  已发送 HTTP 请求,等待响应... 404 Not Found
  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

wget http://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.194.35.179, ... 正在连接到 www.google.com (www.google.com)|173.194.35.180|:80... 已连接。 HTTP 请求已发送,等待响应... 200 OK 长度:7007 (6.8K) [图片/png] 保存到:'logo3w.png' 100%[================================================= ======>] 7,007 --.-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

【讨论】:

    【解决方案3】:

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

    $command = $this->imageMagickFullBinaryPath . ' -resize ' . $dimensions . 
               ' ' . $imageFileToResize . ' ' . $resultingThumbnail; 
    exec($command, $output);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多