Laravel 11在macOS上必须用php@8.3,因官方虽标称≥8.2,但实际依赖8.3新增的ArrayIterator::getArrayCopy()等行为,且8.2存在JIT缺失、opcache配置差异致500错误,而8.4尚未被composer.json兼容。

必须用 Homebrew 装 php@8.3,不能用系统自带 PHP 或 php@8.2,否则 php artisan 直接报错退出。
为什么非得是 php@8.3 而不是 php@8.2 或更高?
Laravel 11 官方文档明确要求 PHP ≥ 8.2,但实际运行中会调用 PHP 8.3 新增的 ArrayIterator::getArrayCopy() 等底层行为;php@8.2 在 macOS 上常因 JIT 缺失或 opcache 配置差异导致 artisan serve 启动后 500 错误且无日志。而 php@8.4 尚未被 Laravel 11 的 composer.json 兼容(会触发 Your requirements could not be resolved)。所以 php@8.3 是当前 macOS 上最稳的交集版本。
- Homebrew 默认不自动启用扩展,
mbstring、pdo、openssl、tokenizer、xml、curl、bcmath、fileinfo、zip这 9 个扩展缺一不可 - 验证命令别只跑
php -v:必须补一句php -m | grep -E "(mbstring|pdo|bcmath)",漏一个就卡在artisan key:generate - Mac M 系列芯片用户注意:
brew install php@8.3安装的是原生 ARM64 版本,无需 Rosetta;但若之前装过 Intel 版本,得先brew uninstall --ignore-dependencies php@8.3再重装
php@8.3 安装后 PATH 和配置文件位置怎么确认?
Homebrew 不会自动把 /opt/homebrew/bin 加进你的 shell PATH,尤其 zsh 用户容易忽略这步。执行完 brew install php@8.3 后,必须手动运行:
echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
然后验证:
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
which php必须输出/opt/homebrew/bin/php(Apple Silicon)或/usr/local/bin/php(Intel) -
php --ini输出的Loaded Configuration File路径应为/opt/homebrew/etc/php/8.3/php.ini - 如果
php --ini显示 “Scan for additional .ini files in: (none)”,说明配置目录没被识别,需检查brew link php@8.3是否成功执行
哪些扩展要手动改 php.ini 才能生效?
Homebrew 安装的 php@8.3 默认只启用基础扩展,Laravel 11 强依赖的扩展大多被注释掉。打开 php.ini(路径见上一步),取消以下行的注释(删掉前面分号):
;extension=mbstring ;extension=pdo ;extension=pdo_mysql ;extension=openssl ;extension=tokenizer ;extension=xml ;extension=curl ;extension=bcmath ;extension=fileinfo ;extension=zip
改完保存,**不用重启终端,但必须确保没有其他 PHP-FPM 或 Apache 进程在后台占着旧配置**。简单办法是执行 brew services stop php(如果之前启用了服务),再运行 php -m 确认所有扩展已加载。
-
pdo_mysql不是必须项,但如果你用 MySQL,它比pdo_sqlite更常用;pdo本身是核心,没它连DB::connection()都报错 -
opcache建议启用:opcache.enable=1+opcache.jit_buffer_size=100M,否则 Laravel 11 的路由缓存和视图编译会慢一倍 - 别碰
memory_limit设太高(比如 2G)——macOS 下 PHP CLI 模式容易因内存分配失败直接 segfault,512M 足够
php -v 显示 8.3.x 但 artisan 仍报错?重点查这三处
常见假成功:终端里 php -v 对了,但 php artisan serve 启动后浏览器 500,storage/logs/laravel.log 里只有 Class 'PDO' not found 或空日志。这时候不是 PHP 版本问题,而是环境错位:
- VS Code 终端或 IDE 内置终端可能没加载
~/.zshrc,导致它调用的是系统旧 PHP —— 在 VS Code 里先执行source ~/.zshrc再开终端 - 某些 GUI 应用(如 TablePlus、Sequel Ace)会读取
~/.bash_profile而非~/.zshrc,导致数据库连接用的还是旧扩展路径 -
composer create-project过程中如果中途断网或 Ctrl+C,vendor/autoload.php可能损坏,此时php artisan会静默失败 —— 直接删掉vendor和composer.lock,重新composer install --no-interaction
最易被忽略的是:Laravel 11 的 bootstrap/app.php 里有一行 if (!extension_loaded('mbstring')) { die('mbstring extension is required.'); },它不走 PHP 错误报告机制,所以不会出现在日志里,只会白屏。


















