PAYATHON 2026

升级到 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,以免暴露本机环境配置。

备注:内容仅供参考。