MAMP免费版默认不带PHP 8.1,因其内置版本列表静态打包,截至2026年最高仅预装PHP 8.0.30;PHP 8.1需通过MAMP Pro下载后复制到免费版/bin/php/目录方可显示并启用。

MAMP 免费版默认不带 PHP 8.1,必须手动下载并启用——不是“升级”现有版本,而是“安装新版本后切换”。
为什么 MAMP 启动界面里没有 PHP 8.1 选项
MAMP 免费版(非 Pro)内置的 PHP 版本列表是静态打包的,官网最新免费版(截至 2026 年仍为 v6.8)最高只预装到 PHP 8.0.30。PHP 8.1 及更新版本仅对 MAMP Pro 用户开放下载入口。你看到下拉菜单里没 8.1,并不是漏装或配置错,是根本没包含。
- 打开
/Applications/MAMP/bin/php/,用ls查看实际存在的目录,大概率只有php7.4.33、php8.0.30这类 - 免费版中点击菜单
File → Change PHP,列表里确实不会出现 8.1 - 别试“替换文件夹”:直接往
/bin/php/里丢一个自己编译的php8.1.0目录,MAMP 主程序不认识,也不会出现在下拉菜单中
在免费版 MAMP 中启用 PHP 8.1 的可行路径
唯一稳定、无需改源码、不破坏 MAMP 结构的方式:用 MAMP Pro 下载 PHP 8.1 包,再复制进免费版目录。MAMP Pro 和免费版共用同一套二进制结构,只是启动时校验逻辑不同。
- 临时启用 MAMP Pro 试用版(官网下载即可,无需付费),启动后进入
Preferences → PHP → Download,勾选PHP 8.1.x并下载 - 下载完成后,退出 MAMP Pro,去 Finder 打开
/Applications/MAMP/bin/php/,此时你会看到新增的php8.1.x文件夹(如php8.1.25) - 把这个文件夹完整复制,粘贴进免费版的
/Applications/MAMP/bin/php/目录(与已有 php7.4、php8.0 等同级) - 重启免费版 MAMP,再点
File → Change PHP,8.1 就会出现——因为菜单是扫描该目录下的所有php*.x子目录动态生成的
终端里用 php 命令调不到 MAMP 的 PHP 8.1?配 PATH 是关键
即使图形界面已切到 PHP 8.1,终端里运行 php -v 仍显示系统自带或旧版,是因为 shell 没指向 MAMP 的 bin。不能靠改 /etc/paths(全局污染),也不能硬编码版本号(一升级就失效)。
立即学习“PHP免费学习笔记(深入)”;
- 编辑
~/.zshrc(macOS 默认 shell),加一行:export PATH="/Applications/MAMP/bin/php/$(ls -t /Applications/MAMP/bin/php/ | head -n1)/bin:$PATH" - 这行命令会自动取
/bin/php/下最新时间戳的子目录(通常就是你刚装的 8.1.x),拼出正确路径 - 执行
source ~/.zshrc,再运行which php,输出应为/Applications/MAMP/bin/php/php8.1.25/bin/php类似路径 - 注意:路径末尾是
/bin,不是/bin/php;少一个层级或多个php都会导致php -v报错
Composer 报错“openssl not loaded”?别只改 php.ini
PHP 8.1 在 MAMP 中启用后,php -m | grep openssl 为空,常见于两个被忽略的点:
-
/Applications/MAMP/bin/php/php8.1.x/conf/php.ini里extension=openssl这行必须**取消注释**(删掉前面的分号),且该文件必须是当前生效的 conf —— 用php --ini确认加载路径 - MAMP 的 OpenSSL 依赖库路径可能和系统不一致,需额外指定:在
php.ini中加入openssl.cafile=/Applications/MAMP/Library/OpenSSL/certs/cacert.pem(路径以你实际 MAMP 安装为准) - 改完后务必重启 MAMP 的 Apache 服务,否则 phpinfo() 页面仍显示未加载
真正麻烦的不是下载或复制,而是路径引用链太长:MAMP 图形界面 → php.ini → openssl.so → cacert.pem。任一环断掉,composer install 就卡在 SSL handshake failed。建议每次换 PHP 版本后,都跑一遍 php -r "print_r(openssl_get_cert_locations());" 看 CA 路径是否对得上。



















