升级到 MAMP 7 后 Apache 无法启动且 PHP symlink 损坏
结论
报错中的 php8.3.1 是升级后留下的旧路径。MAMP 已切换到 PHP 8.3.8,但 php.fcgi 和 PHP 配置软链接仍指向不存在的 php8.3.1。先确认实际安装的 PHP 目录,再修正这些引用,随后检查 Apache 的 mod_rewrite 和站点目录配置。
php.fcgi 路径错误通常会影响 PHP 请求处理,但未必是 MAMP 图形界面无法启动 Apache 的唯一原因。修复 PHP 路径后,如果 GUI 仍然报错,还需检查配置语法、端口占用和残留进程。
确认实际安装的 PHP 版本
目录不一定叫 php8.3.8,先查看 MAMP 中现有的 PHP 目录:
ls -la /Applications/MAMP/bin/php/
确认目标版本包含可执行文件:
ls -la /Applications/MAMP/bin/php/php8.3.8/bin/php-cgi
再检查版本:
/Applications/MAMP/bin/php/php8.3.8/bin/php-cgi -v
如果实际目录名不是 php8.3.8,请将后续命令中的目录名替换为真实名称。
查找遗留的 php8.3.1 引用
先备份 MAMP 配置:
cp -R /Applications/MAMP/conf "$HOME/Desktop/MAMP-conf-backup"
cp /Applications/MAMP/fcgi-bin/php.fcgi "$HOME/Desktop/php.fcgi.backup"
然后搜索旧版本号:
grep -R "php8\.3\.1" \
/Applications/MAMP/conf \
/Applications/MAMP/fcgi-bin \
2>/dev/null
重点检查以下位置:
/Applications/MAMP/fcgi-bin/php.fcgi
/Applications/MAMP/conf/
搜索结果如果还包含 Apache 的其他配置文件,需要逐项确认它们是否也是升级残留。
修正 php.fcgi
查看当前内容:
sed -n '1,20p' /Applications/MAMP/fcgi-bin/php.fcgi
文件中的执行路径应指向实际安装的 php-cgi。以 PHP 8.3.8 为例,核心内容类似:
#!/bin/sh
exec /Applications/MAMP/bin/php/php8.3.8/bin/php-cgi
可以用文本编辑器修改,也可以执行:
sudo sed -i '' \
's|/Applications/MAMP/bin/php/php8.3.1/bin/php-cgi|/Applications/MAMP/bin/php/php8.3.8/bin/php-cgi|g' \
/Applications/MAMP/fcgi-bin/php.fcgi
确认脚本具有执行权限:
sudo chmod 755 /Applications/MAMP/fcgi-bin/php.fcgi
如果以后在 MAMP 中切换 PHP 版本时,这个文件又被覆盖,可以在 MAMP 的 PHP 设置中重新选择一次版本,然后检查新生成的路径。
重建 PHP 配置软链接
先查看损坏的链接:
ls -la /Applications/MAMP/conf/php8.3.1
确认它确实是软链接后再删除:
sudo unlink /Applications/MAMP/conf/php8.3.1
为实际使用的 PHP 版本创建链接:
sudo ln -sfn \
/Applications/MAMP/bin/php/php8.3.8/conf \
/Applications/MAMP/conf/php8.3.8
验证链接:
ls -la /Applications/MAMP/conf/php8.3.8
test -d /Applications/MAMP/conf/php8.3.8 && echo "PHP config link is valid"
如果 /Applications/MAMP/bin/php/php8.3.8/conf 本身不存在,请不要创建这个链接。这通常说明 PHP 组件可能没有完整安装。重新安装对应的 MAMP 7 安装包一般比手工拼接配置目录更稳妥。重新安装前应备份站点、数据库和自定义配置。
检查 Apache 配置
修正路径后,先检查配置语法:
/Applications/MAMP/Library/bin/apachectl -t
正常情况下会返回:
Syntax OK
如果出现 Include、LoadModule、证书或目录不存在等错误,先处理对应问题,再从 MAMP 启动 Apache。
接着再次搜索旧路径,检查是否还有遗漏:
grep -R "php8\.3\.1" \
/Applications/MAMP/conf \
/Applications/MAMP/fcgi-bin \
2>/dev/null
命令没有输出,说明这些目录中的旧引用已经清理完毕。
如果 MAMP 仍然无法启动 Apache
检查是否已有 Apache 进程:
ps aux | grep '[h]ttpd'
再检查 MAMP 配置的 HTTP 和 HTTPS 端口是否被占用。以下命令使用常见的 8888 和 8890 作为示例,实际操作时请以 MAMP 设置中显示的端口为准:
lsof -nP -iTCP:8888 -sTCP:LISTEN
lsof -nP -iTCP:8890 -sTCP:LISTEN
如果之前通过命令行启动过 Apache,请用同一套 MAMP 工具停止它,然后再交给图形界面启动:
/Applications/MAMP/Library/bin/apachectl stop
命令行启动的实例和 MAMP GUI 管理的实例不要同时运行,否则可能因 PID 文件或端口冲突而继续启动失败。
恢复 URL rewrites
先确认 mod_rewrite 已加载:
/Applications/MAMP/Library/bin/apachectl -M | grep rewrite
正常情况下可以看到类似输出:
rewrite_module (shared)
如果没有输出,检查 /Applications/MAMP/conf/apache/httpd.conf 中是否启用了以下配置:
LoadModule rewrite_module modules/mod_rewrite.so
还要检查站点目录的 <Directory> 配置。要允许 .htaccess 中的重写规则,通常需要:
<Directory "/Applications/MAMP/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
如果网站使用自定义 Document Root,请修改对应的目录块,不要直接套用 /Applications/MAMP/htdocs。
修改后再次检查配置并重启:
/Applications/MAMP/Library/bin/apachectl -t
/Applications/MAMP/Library/bin/apachectl restart
确认 .htaccess 位于当前站点实际使用的 Document Root 中,并检查文件名是否确实为 .htaccess。如果使用虚拟主机,还需检查 MAMP 当前加载的虚拟主机配置是否仍指向升级前的目录。
验证修复结果
创建一个临时 PHP 文件,例如 phpinfo.php:
<?php
phpinfo();
通过浏览器访问后,逐项确认:
- PHP 页面能够执行,不再出现
php8.3.1/bin/php-cgi错误; - 页面显示的 PHP 版本与 MAMP 设置一致;
- Apache 可以通过 MAMP GUI 启动和停止;
.htaccess中的重写规则已经生效;apache_error.log中没有新的路径或权限错误。
验证完成后删除 phpinfo.php,以免暴露本机环境配置。
备注:内容仅供参考。
