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

我想做的是将全尺寸图片转换为 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 函数,例如系统、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 有关,请参阅下面的解决方案

有帮助吗?

解决方案

解决了!

原来是环境变量 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 和所有依赖项均与 MacPorts 一起安装在 /opt/local. 。这需要手动添加路径/opt/local/lib到 DYLD_LIBRARY_PATH.

如果我添加路径 /opt/local/libDYLD_LIBRARY_PATH 在 Mac OS X Leopard 中 apachectl 环境变量文件 /usr/sbin/envvars 它不起作用。为什么?这是因为我不使用 Mac OS X Leopard 中的 apache,而是使用 MAMP。

曼普 有它自己的 apachectl 脚本 并且它是自己的 envvars 文件。

我添加了路径 /opt/local/libDYLD_LIBRARY_PATH 在MAMP中 apachectl 环境变量文件 /Applications/MAMP/Library/bin/envvars

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

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

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

菲尔

其他提示

我的路径是 /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

;这有效!

导出 PATH="$PATH:/opt/local/bin"

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top