Apple M1芯片上Apache与PHP模块架构不兼容问题求助
问题背景
你的Apache是从Intel Mac迁移的x86_64架构版本,而PHP是M1原生arm64架构版本,两者架构不匹配导致无法加载PHP模块,错误信息如下:
httpd: Syntax error on line 183 of /usr/local/etc/httpd/httpd.conf: Cannot load /opt/homebrew/Cellar/php/8.2.1/lib/httpd/modules/libphp.so into server: dlopen(/opt/homebrew/Cellar/php/8.2.1/lib/httpd/modules/libphp.so, 0x000A): tried: '/opt/homebrew/Cellar/php/8.2.1/lib/httpd/modules/libphp.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/Cellar/php/8.2.1/lib/httpd/modules/libphp.so' (no such file), '/opt/homebrew/Cellar/php/8.2.1/lib/httpd/modules/libphp.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64'))
文件架构验证结果:
file $(which php) /usr/local/bin/php: Mach-O 64-bit executable arm64 file $(which httpd) /usr/local/bin/httpd: Mach-O 64-bit executable x86_64
解决选项
选项1:重装Apache为arm64原生版本(推荐)
- 停止Apache服务:
sudo apachectl stop - 卸载x86_64版Apache:如果是Intel版Homebrew安装的,执行
arch -x86_64 brew uninstall httpd;不确定的话直接执行brew uninstall httpd - 用M1原生Homebrew安装arm64版Apache:
brew install httpd - 保留原有PHP模块配置(
LoadModule php8_module /opt/homebrew/Cellar/php/8.2.1/lib/httpd/modules/libphp.so),验证配置:apachectl configtest - 重启Apache服务:
sudo apachectl restart
- 停止Apache服务:
选项2:通过Rosetta 2运行x86_64版Apache
- 临时启动方式:用Rosetta模式运行Apache命令:
arch -x86_64 apachectl start - 永久设置:找到
httpd执行文件(路径为/usr/local/bin/httpd),右键选择「显示简介」,勾选「使用Rosetta打开」
注意:此方法会带来轻微性能损耗,后续管理Apache需保持Rosetta模式
- 临时启动方式:用Rosetta模式运行Apache命令:
选项3:重装PHP为x86_64版本适配现有Apache
- 用Rosetta打开终端:右键终端图标→「显示简介」→勾选「使用Rosetta打开」
- 卸载arm64版PHP:
brew uninstall php - 在Rosetta终端中安装x86_64版PHP:
arch -x86_64 brew install php - 修改Apache配置,指向新的x86_64版PHP模块:
LoadModule php8_module /usr/local/Cellar/php/8.2.1/lib/httpd/modules/libphp.so - 验证配置并重启服务:
apachectl configtest && sudo apachectl restart
内容的提问来源于stack exchange,提问作者crmpicco

