Composer 用错 PHP 版本的根本原因是其依赖 shell 中的 php 命令,而非 composer.json 的 platform 配置;应使用 COMPOSER_PHP 环境变量指定解释器,或通过 update-alternatives/brew link 管理系统默认版本,避免直接修改软链接。

为什么 composer 会用错 PHP 版本?
根本原因是 composer 是一个 PHP 脚本(composer.phar),它运行时依赖当前 shell 环境中的 php 可执行文件。如果你系统里装了多个 PHP 版本(比如 /usr/bin/php7.4、/usr/bin/php8.1),而 php 命令软链指向的是某个默认版本,那 composer install 就永远走那个版本 —— 即使你项目 composer.json 里写了 "php": "^8.1",也只校验不强制执行。
用 COMPOSER_PHP 环境变量指定 PHP 解释器
Composer 从 2.2.0 开始原生支持 COMPOSER_PHP 环境变量,这是最干净、无需改全局配置的方式:
- 临时切换:在命令前加环境变量,如
COMPOSER_PHP=/usr/bin/php8.1 composer install - 写入 shell 别名更省事:
alias composer81='COMPOSER_PHP=/usr/bin/php8.1 composer' alias composer74='COMPOSER_PHP=/usr/bin/php7.4 composer'
- 该变量只影响当前命令的 PHP 执行器,不影响
composer.json中的platform.php设置(后者控制包兼容性判断)
别直接改 php 软链接,用 update-alternatives 或 brew link
手动 sudo ln -sf /usr/bin/php8.1 /usr/bin/php 看似简单,但极易引发系统工具(如 APT 包管理器的 postinst 脚本)异常,尤其在 Ubuntu/Debian 上。推荐用系统级管理工具:
- Ubuntu/Debian:
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74 sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81 sudo update-alternatives --config php
-
macOS + Homebrew:
brew unlink php@7.4 && brew link php@8.1
(注意:Homebrew 默认只允许一个php版本被link) - 无论哪种方式,改完后务必验证:
php -v和which php是否一致
platform 配置不是环境切换,别混淆用途
很多人以为在 composer.json 里写:
"config": {
"platform": {
"php": "8.1.0"
}
}就能让 Composer “用 PHP 8.1 运行”,这是典型误解。这个配置只用于模拟平台环境,影响的是依赖解析(比如跳过安装需要 PHP 8.2 的包),但实际执行 autoload、scripts 或插件时,仍走当前 php 命令。真正要跑 post-install-cmd 脚本在 PHP 8.1 下,必须配合 COMPOSER_PHP 或切换系统默认 php。
多 PHP 版本下最易忽略的一点:Composer 的全局 bin 目录(如 ~/.composer/vendor/bin)里的可执行脚本,也会继承当前 php 环境 —— 比如 phpunit 实际是 #!/usr/bin/env php 开头的包装脚本,它调用的仍是系统默认 php,不是 COMPOSER_PHP。这点在 CI 或本地开发调试时经常导致行为不一致。
立即学习“PHP免费学习笔记(深入)”;











