执行 phpstan 报“command not found”是因为 ~/.composer/vendor/bin 未加入 $PATH;需手动添加该路径并重启终端,或改用项目本地安装避免版本冲突与权限问题。

全局安装 PHP 代码检查工具(如 phpstan、psalm、phpcs)用 composer global 是可行的,但默认配置下大概率会遇到命令找不到、版本冲突或权限问题——根本原因不是 Composer 不支持,而是 $PATH 没接上、vendor/bin 路径没暴露、或用户目录权限被 macOS/Linux 的安全策略拦截。
为什么 composer global require phpstan/phpstan 后执行 phpstan 报 “command not found”
Composer 全局安装的二进制文件实际放在 ~/.composer/vendor/bin/(Linux/macOS)或 %APPDATA%\Composer\vendor\bin(Windows),这个路径不在系统 $PATH 中。
- 检查是否已添加:运行
echo $PATH(macOS/Linux)或echo %PATH%(Windows),看输出里有没有~/.composer/vendor/bin - 临时补救:运行
export PATH="$HOME/.composer/vendor/bin:$PATH"(加到~/.zshrc或~/.bashrc才永久生效) - Windows 用户注意:
composer global生成的是.bat文件,CMD/PowerShell 需要重启终端才能识别新路径 - 别用
sudo composer global require—— 这会让二进制写入 root 目录,普通用户根本执行不了
composer global 和项目本地 require --dev 的关键区别
全局安装是“一次装,到处用”,但所有项目共享同一份工具版本;本地安装是“每个项目自己管自己”,能精确控制版本,也避免跨项目干扰。
- 全局适合常用 CLI 工具(如
php-cs-fixer、phpcbf),你日常手动跑检查时图省事 - CI/CD 流水线、团队协作、或需要不同项目用不同
phpstan版本时,必须用本地composer require --dev phpstan/phpstan+./vendor/bin/phpstan -
composer global不受项目composer.json约束,升级时可能意外破坏某个项目的兼容性(比如phpcsv3 升 v4 后规则名全变了) - 全局 bin 目录不参与自动 autoloading,所以不能直接
require全局包里的类——它只提供可执行命令
macOS 上 composer global 失败的典型报错和解法
常见错误信息:file_put_contents(./composer.json): failed to open stream: Permission denied 或安装后 phpstan 命令闪退无输出。
立即学习“PHP免费学习笔记(深入)”;
- 根本原因是 macOS 默认启用
Full Disk Access限制,终端没权限写入~/.composer - 打开「系统设置 → 隐私与安全性 → 完整磁盘访问」,把你的终端(Terminal / iTerm / VS Code 终端)加进去
- 确认
~/.composer所有者是当前用户:ls -la ~/.composer,如果显示root,运行sudo chown -R $(whoami) ~/.composer - 别用 Homebrew 安装的 PHP + 自己编译的 Composer 混搭——容易因 OpenSSL 版本不一致导致
curl error 60,优先用phpbrew或asdf统一管理
真正麻烦的从来不是“怎么装”,而是“谁在用、什么时候用、用完要不要升级”。全局 bin 目录一旦混入多个大版本工具,which phpstan 查出来的到底是哪个,连你自己都得 ls -l $(which phpstan) 看链接才敢确定。











