我遇到了一个真正奇怪的问题,我没有任何解释。
使用XAMPP设置OS X Yosemite和我的本地开发环境后,我通过MacPorts安装了ImageMagick。一切都很好,它在命令行上运行得很好。
然而,当通过Apache执行并通过PHP调用时,我无法获得任何输出。
我做了大量研究,发现了各种方法:
exec()
是否被列为禁用功能(不是)convert
是否可以调用,如可执行文件(它是)我甚至将convert
可执行文件复制到本地项目根目录并尝试exec('./convert');
但是无济于事。我总是收到来自该电话的绝对输出。甚至没有错误消息。毋庸置疑,当我通过终端运行相同的东西时,它工作正常。
我也尝试过:
exec('ls');
查看是否有任何事情发生(是的,确实有效)exec('which convert');
,我根本没有得到任何结果 - 该调用不返回任何内容exec('which ls');
,仔细检查问题是否与which
相关 - 但是ls工作正常并给我/bin/ls
作为回复。chmod 0777
- 无效无论我尝试或做什么,convert
仍然完全无法触及PHP / Apache。
有谁能告诉我为什么会这样,以及如何补救它?
答案 0 :(得分:1)
检查Apache错误日志,我发现以下消息:
dyld: Library not loaded: /opt/local/lib/libfreetype.6.dylib
Referenced from: /opt/local/bin/convert
Reason: Incompatible library version: convert requires version 18.0.0 or later, but libfreetype.6.dylib provides version 15.0.0
研究表明,有一种常见的方法可以在运行时更改适用于Apache及其子进程的一些环境路径变量。然而,由于我不想那样摆弄,我采取了一种更原始的方法:
我打开了一个终端并转到我系统的根目录。我跑了:
find . -name "libfreetype.6.dylib"
这给了我系统上可用的所有libfreetype.6.dylib
个文件。其中一个位于 XAMPP lib
目录中,另一个位于/usr/local/lib
。
我备份 XAMPP 目录中的文件,然后从/usr/local/lib
复制那个文件。
然后我再次通过Apache测试convert
,并给出了与libexpat.1.dylib
相关的另一个非常相似的错误消息。为此,我重复了上面的复制过程。之后,convert
可通过Apache执行,问题解决了。
答案 1 :(得分:0)
当您通过Web服务器运行脚本和程序时,它们由不同的用户运行。在Mac中,这通常是 _www
。无法找到convert
应用程序,因为其可执行文件的路径(可能/usr/local/bin
)未包含在此用户的$PATH
环境设置中。
最简单的解决方案是在命令前加上 convert
的路径,即exec('/usr/local/bin/convert ... ');