我正在与Git上的许多开发人员合作开发一个项目,而现有的代码库使用PECL YAML PHP扩展(v1.0.1)。
我已经尝试了很多步骤在我的MAMP服务器上安装PECL YAML扩展,并且没有任何乐趣!
我假设其他开发人员都在Linux上。
安装中的第一次尝试在我的php_error_log中显示了这个错误:
“[16-Jul-2011 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:math-o,但在第0行的Unknown中错误的架构“
经过大量的时间谷歌搜索后,我意识到我并不孤单,这是因为我使用“./pecl i yaml”编译的扩展名是64位版本
“file yaml.so”: yaml.so:Mach-O 64位包x86_64
但是,将其与我的MAMP设置上的工作扩展名进行比较,即“file xdebug.so”:
xdebug.so:具有2个架构的Mach-O通用二进制文件 xdebug.so(用于架构ppc):Mach-O bundle ppc
xdebug.so(对于架构i386):Mach-O包i386
所以我发现了一些帮助我确定确切问题的博客。
无法在32位MAMP服务器上运行64位扩展 - 这是有道理的。
我的安装过程是:
使用来自博客的命令运行.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“
请
“sudo cp modules / yaml.so /Applications/MAMP/bin/php5.3/lib/php/extensions/no-debug-non-zts-20090626/."
除了我,上述解决方案似乎对所有人都有效。
我的错误日志现在报告:
[16-Jul-2011 11:09:25] PHP警告:PHP启动:无效的库(可能不是PHP库)'yaml.so'在第0行的Unknown中
我现在花了好几个小时就需要你的帮助。
我实际上要做的就是用PHP解析YAML。
我有两个选择:
修复它并呼出一种缓解的迹象
使用PHP YAML解析类,并在将来避免使用此扩展
选项2的问题是由于我无法安装扩展程序,代码库会发生变化。
非常感谢任何建议或解决方案。
干杯
答案 0 :(得分:17)
如果您安装了Homebrew,则可以执行以下操作:
brew install libyaml --universal
否则请安装最新的libyaml。
你可以为32&通过将CFFLAGS
和LDFLAGS
设置为-arch i386 -arch x86_64
来支持64位英特尔。
然后,安装PEAR / PECL(您也可以按照here)
的说明进行操作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文件。
此nice article将演示如何手动安装MAMP堆栈。
答案 1 :(得分:3)
嗯,这不是解决问题的真正办法。但是如果你只想解析YAML我会建议使用Symfony YAML class,这是一个非常容易使用的类来解析YAML。速度还可以,错误信息非常清楚。
是的,它会改变代码库,但这不是一件坏事。我认为这是一个优点,你可以避免使用这样的PECL扩展,因为你现在遇到的问题,如果你需要切换到另一台服务器,你会很高兴你不必检查/安装25个PECL扩展(和他们正确的版本。)
所以我的建议,切换到YAML课程。它会让生活更轻松! :)
答案 2 :(得分:1)
并非所有C代码都是可移植的。 pecl扩展可能存在可移植性问题,因为它可能是在linux上运行的。
如果你感觉很大胆,你可以找出错误是什么,修复它并将修复程序提交给扩展作者。
如果没有,那么使用纯PHP解决方案可能就好了。
此外,如果您只是将Mac上的代码作为开发环境运行,那么在以下情况下您可能不需要它:1)生产是linux或2)该功能不是功能的核心
但是,根据我的经验,我发现最好将您的开发环境与生产箱相同的操作系统和发行版。我使用VirtualBox在VM中运行linux,然后通过SAMBA或NFS映射文件。
希望有帮助...
答案 3 :(得分:0)
基于成功克服围绕MAMP和其他.so模块的问题:[相同类型的错误]
第1步:确保您的MAMP is Version 2版本,因为它包含通用二进制安装程序(32位和64位)
第2步:Modify your Make file并删除其他编译器版本,类似于:
CFLAGS = -Wc,"-arch i386" -Wc,"-arch x86_64" -Wc ....
LDFLAGS = -arch i386 -arch x86_64 .....