本教程旨在解决在Apple M1 Pro芯片设备上为基于x86_64架构的XAMPP环境安装Phalcon php扩展时遇到的架构不兼容问题。核心内容是解释ARM64与x86_64架构间的冲突,并提供下载适用于x86_64架构的Phalcon扩展文件,然后手动配置XAMPP PHP环境的详细步骤,确保扩展能正确加载。
1. 理解M1 mac上的架构挑战
apple m1芯片采用arm64架构,与传统的intel处理器(x86_64架构)截然不同。当我们在m1 mac上运行xampp这类为x86_64架构编译的应用程序时,macos的rosetta 2技术会自动进行转译,使得这些应用能够正常运行。然而,php扩展(如phalcon)作为动态链接库,其架构必须与加载它的php解释器(以及宿主应用xampp)的架构一致。
常见的问题表现为尝试通过包管理器(如MacPorts或Homebrew)安装Phalcon时,这些工具可能会默认编译出ARM64架构的扩展。当XAMPP中运行的x86_64架构PHP尝试加载一个ARM64架构的.so文件时,就会出现以下错误:
PHP Warning: PHP Startup: Unable to load dynamic library '...' (tried: ... (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), ...) in Unknown on line 0
这个错误明确指出,PHP解释器需要x86_64架构的扩展,但找到的是ARM64架构的扩展,导致加载失败。
2. 常见安装尝试及其问题分析
在M1 Mac上安装Phalcon时,用户通常会尝试以下几种方法,并可能遇到不同的问题:
- 使用MacPorts安装: MacPorts可能会为M1芯片原生编译ARM64架构的Phalcon扩展。虽然扩展本身编译成功,但由于XAMPP及其内置的PHP通常以x86_64架构通过Rosetta 2运行,导致架构不匹配。
- 从gitHub源码编译: 直接克隆Phalcon源码并尝试手动编译(cd build && ./install)可能会遇到各种编译错误,这通常与缺少开发依赖、编译环境配置不当或编译器版本不兼容有关。即使编译成功,也需要确保目标架构是x86_64,而非M1的ARM64。
- 使用Homebrew安装: Homebrew也可能遇到类似MacPorts的架构问题。此外,Phalcon的Homebrew Tap(phalcon/extension)可能存在公式过时或与当前Homebrew版本不兼容的问题,导致“Invalid formula”或“undefined method cellar”等错误。
3. 解决方案:手动安装x86_64架构的Phalcon扩展
鉴于架构不兼容是核心问题,最直接有效的解决方案是获取一个预编译的、适用于x86_64架构的Phalcon扩展文件,并手动将其配置到XAMPP环境中。
立即学习“PHP免费学习笔记(深入)”;
3.1 确定XAMPP的PHP版本和扩展目录
首先,需要确认你的XAMPP正在运行的PHP版本,以及其扩展文件的存放路径。
- 检查PHP版本: 在终端中运行XAMPP的PHP:
/Applications/XAMPP/bin/php -v
通常会显示类似 PHP 7.3.x 的版本信息。Phalcon 3.4版本通常与PHP 7.3兼容。
- 查找扩展目录:
- 在终端运行:
/Applications/XAMPP/bin/php -i | grep "extension_dir"
- 或者直接查看XAMPP的php.ini文件(通常位于/Applications/XAMPP/xamppfiles/etc/php.ini),搜索 extension_dir。
- 常见的扩展目录路径是 /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-yyYYMMDD/,其中YYYYMMDD是PHP编译时的API版本。
- 在终端运行:
3.2 下载适用于x86_64架构的Phalcon扩展
由于MacPorts提供了预编译的包,我们可以利用其归档来获取正确架构的扩展。
- 访问MacPorts包归档: 前往MacPorts的包归档页面,查找对应PHP版本和Phalcon版本的x86_64架构包。例如,对于PHP 7.3和Phalcon 3.4,可以访问: https://www.php.cn/link/0334bbbe24552d27a5c4c2dcc41570c3
- 下载x86_64版本: 在该页面中找到与你的macos版本(例如darwin_20对应macos Big Sur及更高版本)和x86_64架构匹配的.tbz2文件。例如:php73-phalcon3-3.4.5_0.darwin_20.x86_64.tbz2。
- 解压文件: 下载后,使用以下命令解压:
tar -xvjf php73-phalcon3-3.4.5_0.darwin_20.x86_64.tbz2
解压后,你会在./opt/local/lib/php73/extensions/no-debug-non-zts-20180731/路径下找到phalcon.so文件。
3.3 部署Phalcon扩展到XAMPP
-
复制phalcon.so: 将解压得到的phalcon.so文件复制到XAMPP的PHP扩展目录。假设你的扩展目录是 /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20180731/:
cp ./opt/local/lib/php73/extensions/no-debug-non-zts-20180731/phalcon.so /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20180731/
请根据你实际的PHP版本和扩展目录路径进行调整。
-
配置php.ini:
- 打开XAMPP的php.ini文件,通常位于 /Applications/XAMPP/xamppfiles/etc/php.ini。
- 在文件末尾或适当位置添加以下行来加载Phalcon扩展:
; Enable Phalcon extension extension=phalcon.so
- 确保extension_dir指令指向了你复制phalcon.so的正确目录。
3.4 重启XAMPP并验证安装
- 重启XAMPP服务: 打开XAMPP控制面板,停止并重新启动apache服务。
- 验证Phalcon:
4. 注意事项与总结
- 架构匹配至关重要: 始终确保你安装的PHP扩展的架构(x86_64或ARM64)与加载它的PHP解释器的架构一致。在M1 Mac上使用XAMPP时,通常意味着需要x86_64架构的扩展。
- PHP版本兼容性: Phalcon扩展版本必须与你的PHP版本兼容。本教程以Phalcon 3.4和PHP 7.3为例。
- extension_dir路径: 仔细核对php.ini中的extension_dir路径,它必须指向phalcon.so文件所在的目录。
- Rosetta 2: 如果你是在M1 Mac上使用Homebrew安装原生的ARM64 PHP,那么你需要为该PHP安装ARM64架构的Phalcon扩展。本教程主要针对XAMPP(通过Rosetta 2运行x86_64 PHP)的情况。
- 权限问题: 确保phalcon.so文件和XAMPP的扩展目录具有正确的读取权限,以便PHP能够访问。
通过遵循上述步骤,并特别关注架构兼容性,你可以在Apple M1 Pro设备上的XAMPP环境中成功安装并启用Phalcon PHP扩展。
评论(已关闭)
评论已关闭