ImageMagick的转换工作在命令行,而不是通过PHP的exec()(ImageMagick c

2019-09-21 10:34发布

我使用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中运行相同的命令,它完美的作品!

我相信这是一个路径问题。 如果是这样,我怎么能检查PHP正在使用的道路,我怎么可以设置在PHP的正确路径?

Answer 1:

首先,你应该尝试与确实存在,并且是可检索输入文件:

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
  Resolving www.google.com (www.google.com)... 173.194.35.179, 173.194.35.177, 173.194.35.178, ...
  Connecting to www.google.com (www.google.com)|173.194.35.179|:80... connected.
  HTTP request sent, awaiting response... 404 Not Found
  2012-08-21 20:55:24 ERROR 404: Not Found.

然后,看看哪些convert你的PHP使用:

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
  Resolving www.google.com (www.google.com)... 173.194.35.180, 173.194.35.177, 173.194.35.179, ...
  Connecting to www.google.com (www.google.com)|173.194.35.180|:80... connected.
  HTTP request sent, awaiting response... 200 OK
  Length: 7007 (6.8K) [image/png]
  Saving to: ‘logo3w.png’

  100%[=====================================================>] 7,007       --.-K/s   in 0.02s   

  2012-08-21 21:04:22 (451 KB/s) - ‘logo3w.png’ saved [7007/7007]

此外,如果它适用于本地文件只(不远程HTTP-URI的),你可能需要检查,如果所使用的HTTP代理 convert您的系统上安装确实:

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


Answer 2:

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
}


Answer 3:

什么工作对我来说是提供的完整路径ImageMagick二进制文件。 相反的convert ,使用/path/to/convert

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


文章来源: ImageMagick convert works in commandline, but not via PHP exec()