【问题标题】:Resolved: MAMP Php can't exec ('convert') after Homebrew ImageMagick install已解决:安装 Homebrew ImageMagick 后 MAMP Php 无法执行(“转换”)
【发布时间】:2011-08-23 15:25:27
【问题描述】:

我在 Lion 上使用 Homebrew 安装了 Imagemagick,一切都很好,只是从 php 调用时它根本不起作用。控制台:

$ convert -version
Version: ImageMagick 6.7.1-1 2011-07-29 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP   

$ which convert
/usr/local/bin/convert

PHP:

echo exec ('convert -version');

或 exec('转换版本', $output); var_dump($output);

不产生任何东西(或空数组)。

exec ('/usr/local/bin/convert') // works, but
exec ('which convert') // doesn't

我需要在本地对此进行测试,以确保我可以在生产环境中检测到转换。但我无法正确测试它。 PATH 已设置,它可以在终端中运行,但不能在 PHP 中运行。

已解决:

事实证明,要让 php 工作 convert 应该在 /usr/bin/ 中,所以这解决了它:

ln -s /usr/local/bin/convert /usr/bin/convert

更新

这是因为 MAMP,这里是修复:http://firedevcom.tumblr.com/post/22791937644/fix-for-homebrew-imagemagick-and-mamp

打开 /Applications/MAMP/Library/bin/envvars

并注释掉以下几行:

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

完成。

【问题讨论】:

  • 在 PHP 的路径中转换?您可能必须在 exec() 调用中指定 /absolute/path/to/convert。请记住,PHP exec() 调用中的环境可能与您在 shell 提示符下获得的环境大不相同。
  • 嗯,问题是 - 一切都在生产服务器上运行,只是不适用于 Homebrew。我认为 PATH 应该被继承到 exec 沙箱中,不是吗?
  • php的shell环境与用户shell环境完全不同。你不能直接比较它们。尝试做exec('echo $PATH'); 看看shell 会发生什么。 PHP 将继承 Apache 环境。
  • 太棒了!那行得通!你可能为我节省了几个小时。我非常感谢@aorcsik!
  • 仅仅编辑环境变量对我不起作用。我也必须在 /usr/bin/ 中创建符号链接才能让 Imagick 在 exec 中工作。另外,请记住在编辑 envvars 后重新启动 MAMP 中的服务器。

标签: php osx-lion imagemagick mamp homebrew


【解决方案1】:

在这里添加我自己的答案,以便您投票:

它是由 MAMP 引起的,这里是修复:http://firedevcom.tumblr.com/post/22791937644/fix-for-homebrew-imagemagick-and-mamp

打开/Applications/MAMP/Library/bin/envvars

并注释掉以下几行:

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

完成。

【讨论】:

  • 也适用于 XAMPP,路径:/Applications/XAMPP/xamppfiles/bin/envvars
【解决方案2】:
sudo ln -s /usr/local/bin/convert /usr/bin/convert

【讨论】:

  • 你救了我!现在我可以使用 exec 命令而不包括绝对路径。
【解决方案3】:

验证 convert in 是服务器的 PATH 环境变量。或者只指定完整路径:

exec('/usr/local/bin/convert -version');

【讨论】:

  • 它在控制台的 PATH 中,但不在 php 的 exec 中,但是在生产服务器上一切似乎都正常。而且我需要能够自动检测 imagemagick。它适用于 Linux,但不适用于自制软件。
【解决方案4】:

exec 返回命令结果的最后一行,恰好是一个空字符串。 如果您想获得输出,只需执行以下操作:

exec('convert -version', $output);
var_dump($output); // it is an array which filled with every line of output from the command

【讨论】:

  • 如果您还想在$output 中出现错误,请使用exec('convert -version 2>&1', $output);
  • 当然我也用过 var_dump,只是什么都不返回
  • 那么使用convert的全路径呢?
【解决方案5】:

只需使用exec("PATH=\$PATH:/usr/local/bin; convert file.pdf file.png");,它就会在运行时添加转换为PATH。

【讨论】:

  • 这正是我所需要的。但是在这里我需要对我的 PHP 代码有所了解,因为我不需要 PATH 到我的现场机器。你知道在mac上设置这个导出路径全局的方法吗?
【解决方案6】:

而不仅仅是 exec("convert .... "); 使用完整路径。你可以通过输入终端来获取它

类型转换

你应该得到类似的东西: convert 是散列的 (/opt/local/bin/convert)

所以现在使用:

exec("/opt/local/bin/convert ....");

[感谢@Nikki]

在那之后注释掉

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

在 /Applications/MAMP/Library/bin/envvars 中

【讨论】:

  • 一旦您的项目进入生产阶段,您很快就会发现这是一个坏习惯。
猜你喜欢
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多