ImageMagick:通过PHP转换PNG失败,但通过Bash shell可以工作

5

我有一个非常奇怪的错误,我还没有找到解决方法。 更新 请查看下面的解决方案。

我正在尝试将全尺寸图片转换为160x120缩略图。 对于任何大小的jpg和jpeg文件都可以很好地工作,但对于png文件则不行。

ImageMagick命令:

/opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'

PHP函数(简写)

...
$cmd = "/opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'";
exec($cmd, $output, $retval);
$errors += $retval;
if ($errors > 0) {
    die(print_r($output));
}

当此函数运行时,$retval等于1,这意味着转换命令失败(缩略图未创建)。
这就是有趣的地方,如果我在我的shell中运行完全相同的命令,它可以正常工作。
wedbook:~ wedix$ /opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'
wedbook:~ wedix$ 

我尝试使用不同的PHP函数,如system、passthru,但它们没有起作用。我想也许这里有人知道解决方法。

我正在使用:

  1. MAMP 1.7.2
    • Apache/2.0.59
    • PHP/5.2.6

谢谢!

更新

我更新了以下依赖项:

  1. libpng从1.2.35到1.2.37
  2. libiconv从1.12_2到1.13_0
  3. ImageMagick 6.5.2-4_1到6.5.2-9_0

然而,它并没有解决我的问题。

第二次更新

我终于找到了一些可能有用的东西,当函数运行时,这就是在Apache日志中打印出来的内容:

dyld: Library not loaded: /opt/local/lib/libiconv.2.dylib
  Referenced from: /opt/local/bin/convert
  Reason: Incompatible library version: convert requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0

第三次更新

libiconv.2.dylib版本为8.0.0...

bash-3.2$ otool -L /opt/local/lib/libiconv.2.dylib 
/opt/local/lib/libiconv.2.dylib:
    /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

第四次更新

问题与MAMP相关,解决方法如下:

4个回答

7

问题已解决!

原来是环境变量DYLD_LIBRARY_PATH没有正确设置。

Mac OS X Leopard自带libiconv 7.0.0,但convert需要8.0.0(见上面的第二个更新)。

bash-3.2$ otool -L /usr/lib/libiconv.2.dylib 
/usr/lib/libiconv.2.dylib:
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.1)

使用MacPorts在/opt/local下安装了ImageMagick和所有依赖项。这需要手动将路径/opt/local/lib添加到DYLD_LIBRARY_PATH中。
如果我在Mac OS X Leopard的apachectl envvars文件/usr/sbin/envvars中添加路径/opt/local/libDYLD_LIBRARY_PATH,它不起作用。为什么?因为我不使用来自Mac OS X Leopard的apache,而是使用MAMP。
MAMP有自己的apachectl脚本和envvars文件。
我在MAMP的apachectl envvars文件/Applications/MAMP/Library/bin/envvars中添加了路径/opt/local/libDYLD_LIBRARY_PATH
DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

现在我的PNG缩略图已经生成,而且apache错误日志中没有出现任何错误!希望这能帮到有需要的人,并且下次我会记得在寻求帮助前检查所有日志文件! - Phil

在阅读了关于COMMAND_MODE问题的文章后,本来想建议这可能是Leopard特有的问题。干得好 :) - defines
伙计,这对我不起作用,我正在抓狂......除了这里没有提到的任何其他指令,你可能已经做过了吗? - mga
嗨...我可以像这样制作一个“hello world”:exec("convert logo: logo.gif"),它可以正常工作...然而,一个更复杂的转换在shell中可以工作但在exec()中不行:/opt/local/bin/convert -size 758x185 /Applications/MAMP/htdocs/recetas/img/photo/old.tmp -crop 470x185+142+0! -quality 100 +profile "*" /Applications/MAMP/htdocs/recetas/img/photo/new.jpg...我正在创建logo.gif,它与old.tmp在同一个目录下,所以这不是路径的问题(此外,如果我在bash或sh中复制/粘贴命令,它可以正常工作)。在apache中出现的错误(没有php错误)是sh: command_here: No such file or directory - mga
记录一下:似乎escapeshellarg()函数对路径做了某些处理,导致ImageMagick无法工作。我以前从未使用过它,但在php.net上看到它被推荐,所以就用了它,结果浪费了三天时间来调试这个该死的东西... 哎,算了。 - mga
嘿,你真棒!这对我很有帮助。我使用Homebrew安装了Imagick,并且在新版本的OSX(Lion)中,X11已经安装好了。我遇到了一个问题,即使我包含了/usr/local/lib,但仍然无法使用png格式。所以我不得不包含/usr/X11/lib。现在它可以工作了! - slik

5

我的路径是 /opt/local/bin,但即使将其添加到 DYLD_LIBRARY_PATH 中也无法运行。最终当我改变了 PATH 时,通过 PHP 运行成功了。

;没有起作用...

;DYLD_LIBRARY_PATH="/opt/local/bin:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

;export DYLD_LIBRARY_PATH

;这个可行!

export PATH="$PATH:/opt/local/bin"


谢谢,谢谢,谢谢!这帮助我解决了问题 :) - Stiropor
谢谢!我知道这些“感谢”评论是不被鼓励的,但这对我来说结束了一场漫长而混乱的战斗。 - Matt Stein

1

请确保运行 PHP 代码的用户对文件和目录具有相同的权限。


是的,图像和缩略图文件夹也是可写的。 - Phil M.

0

这些应该很明显,但请确保检查诸如 PHP 安全模式、open_basedir 以及是否已禁用 exec 等内容。


他们没有禁用,我能够从JPG和JPEG文件生成缩略图,但无法从PNG文件生成。请参见以下解决方案。 - Phil M.

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