根本原因是终端未以arm原生架构运行:m1/m2/m3芯片需arm64终端,rosetta模拟的i386会导致brew装到/usr/local而非/opt/homebrew,引发路径错乱、command not found或permission denied;应关闭rosetta、清理旧brew、重装并验证arch、which brew及brew doctor。

brew install php 报 command not found 或 Permission denied
根本原因不是 brew 没装好,而是终端没用 ARM 原生架构运行(M1/M2/M3 芯片必须注意)。Rosetta 模拟的 x86_64 终端会把 brew 装到 /usr/local,但新版 Homebrew 默认走 /opt/homebrew,路径错乱直接导致 php 找不到或权限拒绝。
- 先确认终端是否原生:执行
arch,输出arm64才对;若为i386,就说明开了 Rosetta —— 关掉它(右键 Terminal → “显示简介” → 取消勾选“使用 Rosetta”) - 检查 brew 安装位置:
which brew,应为/opt/homebrew/bin/brew;如果不是,旧版残留的/usr/local/bin/brew很可能冲突 - 安全清理旧 brew:
sudo rm -rf /usr/local/Homebrew /usr/local/bin/brew,再重装(不用 sudo):/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - 装完立刻验证:
brew --version和brew doctor都不报红,才算环境干净
brew install php@8.3 提示 “No available formula” 或 “deprecated”
Homebrew 官方仓库只保留最新两个稳定版 PHP(当前是 8.3 和 8.2),老版本如 7.4、8.0 已移除。强行写 brew install php@8.0 会失败,不是命令错了,是公式真没了。
- 查可用版本:
brew search php,看到类似shivammathur/php/php@8.1这种第三方 tap 的条目,才是老版本入口 - 启用第三方源:
brew tap shivammathur/php,之后才能brew install shivammathur/php/php@8.1 - 安装后不会自动 link,必须手动:
brew link --force --overwrite php@8.1,否则php -v仍显示旧版或报错 - 注意路径差异:shivammathur 版本默认装在
/opt/homebrew/opt/php@8.1/bin/php,不是官方版的/opt/homebrew/bin/php
php -v 正常但 php --ini 显示加载的是 /etc/php.ini
Mac 自带的系统 PHP(/usr/bin/php)残留配置会干扰 Homebrew 安装的 PHP,尤其当你没删干净旧配置时,php --ini 显示的 ini 文件路径可能是系统级的,导致扩展、时区、内存限制全不生效。
- 先定位真实配置路径:
php --ini输出里 “Loaded Configuration File” 那行才是关键;如果是/etc/php.ini,说明没走 Homebrew 的配置 - Homebrew PHP 的真实配置在:
/opt/homebrew/etc/php/8.3/php.ini(版本号按实际替换),这个文件默认是 .sample 后缀,需手动重命名:cp /opt/homebrew/etc/php/8.3/php.ini.sample /opt/homebrew/etc/php/8.3/php.ini - 改完别忘了 reload:如果用了 php-fpm,要
brew services restart php;如果只用 CLI,关掉终端重开即可 - 验证是否生效:
php -r "echo ini_get('memory_limit');",输出应是你刚在 php.ini 里设的值,不是 128M(系统默认)
brew services start php 启动失败,提示 “Permission denied” 或 “Address already in use”
php-fpm 默认监听 127.0.0.1:9000,但 macOS 自带的 Apache 或之前没关干净的 php-fpm 实例可能占着端口,或者权限不够写 pid 文件。
- 查端口占用:
sudo lsof -i :9000,看到进程就 kill 掉(kill -9 PID) - 改监听方式:编辑
/opt/homebrew/etc/php/8.3/php-fpm.d/www.conf,把listen = 127.0.0.1:9000改成listen = /opt/homebrew/var/run/php-fpm.sock(Unix socket 更安全,也避端口冲突) - 确保 sock 目录可写:
sudo mkdir -p /opt/homebrew/var/run,再sudo chown $(whoami):admin /opt/homebrew/var/run - 启动前先测试配置:
php-fpm -t,成功再brew services start php
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











