您好,欢迎访问宜昌市隼壹珍商贸有限公司
400 890 5375Composer 用错 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
alias composer81='COMPOSER_PHP=/usr/bin/php8.1 composer' alias composer74='COMPOSER_PHP=/usr/bin/php7.4 composer'
composer.json 中的 platform.php 设置(后者控制包兼容性判断)php 软链接,用 update-alternatives 或 brew link
手动 sudo ln -sf /usr/bin/php8.1 /usr/bin/php 看似简单,但极易引发系统工具(如 APT 包管理器的 postinst 脚本)异常,尤其在 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
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 或本地开发调试时经常导致行为不一致。