【问题标题】:ImageMagick: convert png fail via PHP and works via bash shellImageMagick:通过 PHP 转换 png 失败并通过 bash shell 工作
【发布时间】:2009-06-19 19:54:07
【问题描述】:

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

我要做的是将全尺寸图片转换为 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 from 1.2.35 to 1.2.37
  2. libiconv from 1.12_2 to 1.13_0
  3. ImageMagick 6.5.2-4_1 to 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 有关,请参阅下面的解决方案

【问题讨论】:

    标签: php apache2 imagemagick mamp


    【解决方案1】:

    解决了!

    原来环境变量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)
    

    ImageMagick 和所有依赖项都使用 MacPorts 安装在 /opt/local 下。这需要手动将路径 /opt/local/lib 添加到DYLD_LIBRARY_PATH

    如果我在 Mac OS X Leopard apachectl envvars 文件 /usr/sbin/envvars 中将路径 /opt/local/lib 添加到 DYLD_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 错误日志中没有生成任何错误!

    我希望这会对某人有所帮助,下次我会记得在寻求帮助之前检查每个日志文件!

    菲尔

    【讨论】:

    • 在阅读了关于 COMMAND_MODE 问题的信息后,本以为这是 Leopard 特有的问题。干得好:)
    • 伙计,这对我不起作用,我在这里拉头发……您可能已经完成了此处未提及的任何其他说明吗?
    • 嗨...我可以创建一个像exec("convert logo: logo.gif") 这样的“hello world”,它工作正常...但是,更复杂的转换将在shell 中工作,但在exec() 中不起作用:@987654335 @...我正在与 old.tmp 相同的目录中创建 logo.gif,因此这不是路径问题(此外,如果我在 bash 或 sh 中复制/粘贴命令,则事情有效。apache 中的错误(不php 错误)是sh: command_here: No such file or directory
    • 记录在案:似乎escapeshellarg() 函数对导致 ImageMagick 无法工作的路径做了一些事情。我以前从未使用过它,但在 php.net 中将其视为推荐,所以继续使用它,只是浪费了整整三天时间调试这个该死的东西......哦,好吧
    • 你好摇滚!这帮助了我。我使用自制软件安装了 imagick,并且使用新版本的 OSX (Lion),X11 已经安装。我在包含 /usr/local/lib 时遇到了问题,但我仍然无法使用 png 格式。所以我必须包含/usr/X11/lib。现在可以了!
    【解决方案2】:

    我的路径是 /opt/local/bin,但即使将其添加到 DYLD_LIBRARY_PATH 也不起作用。最后,当我只更改普通的 ole PATH 时,它通过 PHP 工作。

    ;没有成功...

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

    ;导出 DYLD_LIBRARY_PATH

    ;这行得通!

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

    【讨论】:

    • 谢谢谢谢谢谢!这帮助我解决了问题:)
    • 谢谢!我知道这些“谢谢”的 cmets 不鼓励,但这结束了我漫长而混乱的战斗。
    【解决方案3】:

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

    【讨论】:

    • 是的,images 和 thumbs 文件夹也是全局可写的。
    【解决方案4】:

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

    【讨论】:

    • 它们没有被禁用,我能够从 JPG 和 JPEG 文件生成缩略图,但不能从 PNG 文件生成缩略图。请参阅下面的解决方案
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多