ImageMagick:通过PHP转换png文件,并通过bash shell工作

时间:2009-06-19 19:54:08

标签: php apache2 imagemagick mamp

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

我要做的是将全尺寸照片转换为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
  2. 谢谢!

    更新

    我更新了以下依赖项

    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
    4. 然而,它并没有解决我的问题。

      第二次更新

      我终于找到了一些可能有用的东西,当函数运行时,这是在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)
      

      第4次更新

      问题与MAMP有关,请参阅下面的解决方案

4 个答案:

答案 0 :(得分:7)

解决了!

事实证明环境变量DYLD_LIBRARY_PATH未正确设置。

Mac OS X Leopard附带libiconv 7.0.0但转换需要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和所有依赖项都是使用/opt/local下的MacPorts安装的。这需要手动将路径/ opt / local / lib添加到DYLD_LIBRARY_PATH

如果我在Mac OS X Leopard /opt/local/lib envvars文件DYLD_LIBRARY_PATH中将路径apachectl添加到/usr/sbin/envvars,则无效。为什么?这是因为我不使用Mac OS X Leopard的apache,我使用MAMP。

MAMP 有自己的 apachectl脚本和它自己的 envvars文件。

我在MAMP /opt/local/lib envvars文件DYLD_LIBRARY_PATH

中添加了路径apachectl/Applications/MAMP/Library/bin/envvars
DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

现在我的PNG缩略图正在生成,并且在apache错误日志中没有生成错误!

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

菲尔

答案 1 :(得分:5)

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

;没有用......

; DYLD_LIBRARY_PATH = “/选择/ local / bin中:/应用/ MAMP /库/ lib中:$ DYLD_LIBRARY_PATH”

;导出DYLD_LIBRARY_PATH

这有效!

export PATH =“$ PATH:/ opt / local / bin”

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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