M1(Apple Silicon)MacBook配置Apache多版本PHP时sphp切换无效
M1 Mac 下
sphp 切换PHP版本不生效的排查方案 首先明确核心逻辑:你遇到的版本不匹配问题,本质不是$apache_conf_path单参数配置错误,而是适配Intel芯片的老sphp脚本,在Apple Silicon环境下的路径映射、运行逻辑和你实际环境的服务规则存在多处偏差,按以下步骤逐项核对即可解决。
核心偏差说明
老教程配套的sphp脚本本身的设计逻辑,根本不会操作Homebrew的常驻PHP服务,它的动作只有两个:
- 把
/opt/homebrew/bin/php的全局CLI软链接,指向你要切换的PHP版本二进制文件 - 修改Apache配置文件里的
LoadModule段,指向对应版本的PHP模块so文件,再重启Apache让配置生效
也就是说,brew services列表里显示PHP@8.0处于启动状态、PHP@5.6处于停止状态,和Apache实际加载的PHP版本没有必然关系——那个后台运行的PHP@8.0服务是当初安装时自动注册的FPM/CGI独立服务,属于完全独立于mod_php运行模式的进程,sphp脚本从设计上就没有停掉这个服务的逻辑,自然不会在切换版本时自动改变它的运行状态。
逐项排查修正步骤
- 核对
$apache_conf_path的实际指向
M1芯片下Homebrew安装的Apache默认配置路径是/opt/homebrew/etc/httpd/httpd.conf,不要沿用老教程里Intel芯片的/usr/local/etc/httpd/httpd.conf路径。确认路径正确后,打开这个配置文件,检查所有和PHP模块相关的LoadModule行:执行完sphp 5.6后,被取消注释启用的LoadModule行,应该明确指向/opt/homebrew/Cellar/php@5.6/5.6.40/lib/httpd/modules/libphp5.so,如果路径写错、Apache重启时加载该模块失败,就会保留之前能正常加载的PHP@8.0模块配置,这也是最常见的切版本无效的原因。 - 验证CLI软链接的实际状态
脚本提示“创建PHP@5.6软链接”不代表软链接真的生效,手动执行ls -l /opt/homebrew/bin/php查看输出,如果软链接没有正确指向/opt/homebrew/Cellar/php@5.6/5.6.40/bin/php,说明你改脚本路径时漏了字符(比如漏写php@5.6里的@符号、把opt写成了usr),脚本的提示输出只是固定文案,实际软链接创建动作已经因为路径不存在失败了。 - 跳过
brew services状态干扰,验证Apache实际运行的PHP版本
在Apache的web根目录创建phpinfo.php文件,写入<?php phpinfo(); ?>,本地访问这个页面,查看Server API、Loaded Configuration File两个字段的路径,就能100%确认Apache对外提供服务时加载的PHP版本——这个结果才是你配置是否生效的判断标准,不要用brew services的运行状态作为判断依据。 - 可选:如果需要同步管理Homebrew的PHP常驻服务
如果你希望sphp切换版本时自动停掉不需要的PHP@8.0常驻服务,可以在sphp脚本里Apache重启的逻辑之前,加上对应版本的服务启停命令,比如切换到PHP@5.6时执行brew services stop php && brew services start php@5.6。注意如果你的方案是mod_php模式,根本不需要让PHP@5.6跑常驻FPM服务,这个逻辑加不加都不影响Apache加载mod_php的版本。
内容的提问来源于stack exchange,提问作者Ringo Starch
相关产品推荐
相关产品推荐

