即使使用绝对路径调用,Apache / PHP也无法执行转换

时间:2014-10-18 21:10:11

标签: php xampp imagemagick executable osx-yosemite

我遇到了一个真正奇怪的问题,我没有任何解释。

使用XAMPP设置OS X Yosemite和我的本地开发环境后,我通过MacPorts安装了ImageMagick。一切都很好,它在命令行上运行得很好。

然而,当通过Apache执行并通过PHP调用时,我无法获得任何输出。

我做了大量研究,发现了各种方法:

  • 在Apache中设置路径环境变量(我尝试过)
  • 使用可执行文件的绝对路径(我这样做)
  • 检查exec()是否被列为禁用功能(不是)
  • 检查convert是否可以调用,如可执行文件(它是)

我甚至将convert可执行文件复制到本地项目根目录并尝试exec('./convert');但是无济于事。我总是收到来自该电话的绝对输出。甚至没有错误消息。毋庸置疑,当我通过终端运行相同的东西时,它工作正常。

我也尝试过:

  • 致电exec('ls');查看是否有任何事情发生(是的,确实有效)
  • 调用exec('which convert');,我根本没有得到任何结果 - 该调用不返回任何内容
  • 致电exec('which ls');,仔细检查问题是否与which相关 - 但是ls工作正常并给我/bin/ls作为回复。
  • 向可执行文件提供chmod 0777 - 无效

无论我尝试或做什么,convert仍然完全无法触及PHP / Apache。

有谁能告诉我为什么会这样,以及如何补救它?

2 个答案:

答案 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 ... ');