11

我正在与许多开发人员通过 Git 开展一个项目,现有代码库使用 PECL YAML PHP 扩展(v1.0.1)。

我已经尝试了许多步骤来在我的 MAMP 服务器上安装 PECL YAML 扩展,但并不高兴!

我假设其他开发人员都在 Linux 上。

安装的前几次尝试在我的 php_error_log 中发现了这个错误:

“[2011 年 7 月 16 日 11:29:13] PHP 警告:PHP 启动:无法加载动态库 '/Applications/MAMP/bin/php5.3/lib/php/extensions/no-debug-non-zts- 20090626/yaml.so' - dlopen(/Applications/MAMP/bin/php5.3/lib/php/extensions/no-debug-non-zts-20090626/yaml.so, 9):找不到合适的图像。确实找到了:/Applications/MAMP/bin/php5.3/lib/php/extensions/no-debug-non-zts-20090626/yaml.so:mach-o,但第 0 行的 Unknown 中的架构错误“

经过大量时间谷歌搜索后,我意识到我并不孤单,这是因为我使用“./pecl i yaml”编译的扩展是 64 位版本

“文件 yaml.so”:yaml.so:Mach-O 64 位捆绑包 x86_64

但是,将此与我的 MAMP 设置上的工作扩展(即“文件 xdebug.so”)进行比较:

xdebug.so:具有 2 个架构的 Mach-O 通用二进制文件
xdebug.so(用于架构 ppc):Mach-O 捆绑 ppc
xdebug.so(用于架构 i386):Mach-O 捆绑 i386

因此,我发现了许多帮助我确定确切问题的博客。

无法在 32 位 MAMP 服务器上运行 64 位扩展 - 有道理。

我的安装过程是:

  • 下载 PECL YAML 源码
  • 将 tar 和 cd 提取到模块源中
  • phpize 在模块目录中
  • 使用博客中的命令运行 .configure:

    "CFLAGS='-O3 -fno-common -arch i386 -arch x86_64 -g -Os' LDFLAGS='-O3 -arch i386 -arch x86_64' CXXFLAGS='-O3 -fno-common -arch i386 -arch x86_64 -g -Os' ./configure --disable-dependancy-tracking --disable-shared -enable-static"

  • 制作

  • 将创建的模块从 modules/yaml.so 复制到 MAMP:

    “sudo cp 模块/yaml.so /Applications/MAMP/bin/php5.3/lib/php/extensions/no-debug-non-zts-20090626/。”

上述解决方案似乎对我以外的所有人都有效。

我的错误日志现在报告这个:

[2011 年 7 月 16 日 11:09:25] PHP 警告:PHP 启动:第 0 行的未知库(可能不是 PHP 库)“yaml.so”无效

我现在已经花了好几个小时了,需要你的帮助。

我实际上要做的就是在 PHP 中解析 YAML。

我有两个选择:

  1. 修好它,然后呼吸一下解脱的迹象

  2. 改用 PHP YAML 解析类,以后避免使用此扩展

选项 2 的问题是,由于我无法安装扩展,代码库会发生变化。

任何建议或解决方案将不胜感激。

干杯

4

4 回答 4

17

如果您安装了Homebrew,那么您可以执行以下操作:

brew install libyaml --universal

否则安装最新的libyaml

CFFLAGS您可以通过设置和LDFLAGS来为 32 位和 64 位 Intel 构建-arch i386 -arch x86_64

然后,安装 PEAR/PECL(您也可以按照此处的说明进行操作)

wget http://pear.php.net/go-pear.phar
sudo php -d detect_unicode=0 go-pear.phar

默认情况下,它将安装在~/pear/目录中。现在运行

sudo ~/pear/bin/pecl install yaml

然后,照顾so文件。


这篇不错的文章将演示如何手动安装 MAMP 堆栈。

于 2011-11-30T11:59:51.280 回答
3

好吧,这不是您问题的真正解决方案。但是如果你只想解析 YAML,我建议使用Symfony YAML 类,它是一个非常易于使用的类来解析 YAML。速度还可以,错误信息也很清楚。

是的,它会改变代码库,但这不是一件坏事。我认为当您可以避免使用这样的 PECL 扩展时,这是一个加分项,因为您现在遇到的问题以及如果您需要切换到另一台服务器,您会很高兴您不必检查/安装 25 个 PECL 扩展(及其正确版本)。

所以我的建议是切换到 YAML 类。它会让生活更轻松!:)

于 2011-11-29T22:09:24.033 回答
1

并非所有 C 代码都是可移植的。pecl 扩展可能存在可移植性问题,因为它可能打算在 linux 上运行。

如果你觉得大胆,你可以找出错误是什么,修复它并将修复提交给扩展作者。

如果没有,那么使用纯 PHP 解决方案可能是要走的路。

此外,如果您只是在 Mac 上将代码作为开发环境运行,那么您可能不需要它在以下情况下工作:1)生产是 linux 或 2)该功能不是功能的核心

但是,根据我的经验,我发现最好让您的开发环境与您的生产环境具有相同的操作系统和发行版。我会使用 VirtualBox 在 VM 中运行 linux,然后将文件映射到 SAMBA 或 NFS。

希望有帮助...

于 2011-12-01T21:41:12.593 回答
0

基于成功克服围绕 MAMP 和其他 .so 模块的问题:[相同类型的错误]

第 1 步:确保您的MAMP 版本是版本 2,因为它包含通用二进制安装程序(32 位和 64 位)

第 2 步:修改您的 Make 文件并消除其他编译器版本,类似于:

CFLAGS = -Wc,"-arch i386" -Wc,"-arch x86_64" -Wc ....
LDFLAGS = -arch i386 -arch x86_64 .....
于 2011-12-02T21:59:08.847 回答