Mac升级PHP需用Homebrew并行安装7.4与8.3,通过brew link切换CLI版本,同步更新Valet/Nginx的PHP-FPM配置、重装对应扩展、迁移php.ini设置,并检查代码兼容性(如动态属性弃用、字符串比较逻辑变更)。

Mac 本地环境从 PHP 7.4 升级到 PHP 8.3,核心是用 Homebrew 并行安装 + 精准切换,不能直接覆盖或强删旧版——老项目可能还得回退跑。整个过程要确保 CLI、Web 服务(如 Valet 或 Nginx+PHP-FPM)、扩展、配置三者同步更新,否则会出现 php -v 是 8.3,但网页里 phpinfo() 还是 7.4 的“双版本幻觉”。
用 Homebrew 安装 PHP 8.3 并保留 7.4
Homebrew 是 Mac 上最可控的方式,推荐使用 shivammathur/php tap(持续维护、版本全、含调试符号):
- 添加源:
brew tap shivammathur/php - 安装 PHP 8.3:
brew install shivammathur/php/php@8.3 - 确认已装两个版本:
brew list | grep php@应看到php@7.4和php@8.3
切换默认 CLI 版本并验证路径
切换不是改配置,而是改符号链接和 shell 路径:
- 先断开当前链接:
brew unlink php@7.4 - 链接新版:
brew link --force --overwrite php@8.3 - 检查 PATH 顺序:运行
echo $PATH,确保/opt/homebrew/opt/php@8.3/bin(Apple Silicon)或/usr/local/opt/php@8.3/bin(Intel)排在最前面 - 验证:
php -v输出应为PHP 8.3.x;which php指向对应路径
同步更新 Web 服务使用的 PHP-FPM
CLI 切了,不代表网页就用了新版本。常见情况分两类:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
用 Laravel Valet:直接运行
valet use php@8.3,它会自动重启 FPM 并重配 Nginx -
手动配 Nginx/Apache:检查
nginx.conf中fastcgi_pass是否指向新版 socket,例如:127.0.0.1:9003或unix:/opt/homebrew/var/run/php/php8.3-fpm.sock;然后重启服务:brew services restart php@8.3
重装扩展并适配 php.ini
PHP 8.3 不兼容 7.4 编译的扩展,必须重新安装:
- 扩展统一用 brew 安装(不建议 pecl):
brew install php@8.3-redis php@8.3-mysql php@8.3-opcache - 确认加载:
php -m | grep -E "(redis|mysql|opcache)" - php.ini 路径变了:
php --ini查看 Loaded Configuration File,通常为/opt/homebrew/etc/php/8.3/php.ini;把原 7.4 的关键配置(如date.timezone、memory_limit)复制过去,别直接覆盖
代码与依赖兼容性检查
升级后跑不起来,大概率是语言行为变更,不是环境问题:
- 运行
composer update前先执行composer check-platform-reqs,确认框架(如 Laravel 10+)、扩展(如 guzzlehttp/guzzle ^7.5)支持 PHP 8.3 - 重点检查:动态属性被弃用(
$obj->newProp = 1会报 Deprecated)、未定义常量返回""改为抛Error、字符串比较逻辑更严格("00" == 0在 8.3 为 false) - 临时加一行
error_reporting(E_ALL | E_STRICT);到入口文件,捕获所有警告级提示
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










