图片处理软件ImageMagick在命令行中可以正常工作,但在PHP的exec()函数中返回错误代码5并提示"不兼容的库版本"。

8
我在使用MAMP(和Macports)和OS X上的php 5.3.6和ImageMagick(命令行)时遇到了奇怪的问题。
当我从CLI运行identify命令时,它可以正常工作。但是当我使用exec()运行完全相同的命令时,它返回一个值代码5,并且在apache错误日志中我有:
dyld: Library not loaded: /opt/local/lib/libfreetype.6.dylib Referenced from: /opt/local/bin/identify Reason: Incompatible library version: identify requires version 14.0.0 or later, but libfreetype.6.dylib provides version 13.0.0
例如: cli命令是: /opt/local/bin/identify /Users/leonardteo/Documents/1.jpg 当从命令行执行时,这可以正常工作。当从PHP执行时: exec("/opt/local/bin/identify /Users/leonardteo/Documents/1.jpg", $output, $return); $return5 $output为空
检查apache日志会显示libfreetype的上述问题。
我使用Macports安装了ImageMagick。我还尝试了从源代码手动构建并从/usr/local/bin/identify运行identify,结果相同。我还尝试从Macports而不是MAMP运行PHP,结果相同。
请问有人能帮忙解决这个问题吗?

PHP在执行某个库文件时,不知何故使用了另一个副本。请检查您的路径,确保没有冲突的版本。 - Brad
CLI php通常与SAPI php有一个单独的.ini文件,因此这两个.ini可能会加载库的不同版本。 - Marc B
@Marc B:这不是在命令行界面和Apache上运行PHP之间的问题。它是在Bash shell上执行实际的cli命令和通过PHP执行完全相同的命令之间的区别。 - Leonard Teo
嗯。哎呀...对了。imagick是静态编译到PHP中的吗?可能它在内部有v14,但你已经为系统安装了v13。 - Marc B
不,我不是试图在 PHP 中运行编译为 PHP 的 IM。我正在尝试使用 exec() 作为命令行工具从 PHP 中执行它。我安装了两个版本的 IM:一个是使用 Macports(在 PHP 中会给我 libfreetype 错误),另一个是从 /usr/local/bin 中的源安装(同样也会抛出另一个错误,但只在 PHP 中)。 - Leonard Teo
天啊,这就是答案:编辑此文件:
/Applications/MAMP/Library/bin/envvars
注释掉以下行:
DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH
重新启动MAMP/Apache。然后它就可以工作了。
- Leonard Teo
1个回答

18

编辑这个文件:

/Applications/MAMP/Library/bin/envvars

注释掉以下内容:

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

export DYLD_LIBRARY_PATH


不错,另一种方法是将服务器实例简单地切换到开箱即用的XAMPP http://tekkie.flashbit.net/developer-tools/workaround-for-imagemagick-convert-returning-5 - Ain Tohvri
非常感谢!我已经尝试了几个小时,想找出为什么它不能工作的原因。幸运的是,StackOverflow和你,亲爱的先生,再次拯救了我!;) - maddob
在XAMPP中,路径为/Applications/XAMPP/bin/envvars,因为我使用了homebrew,所以我没有将其注释掉,而是用/usr/local/lib替换了[...]/lib - Morgan Delaney

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