composer --version第一行明确显示真实运行的PHP版本与环境,如“PHP 8.2.15 (cli)”,这才是Composer实际依赖的PHP解释器,而非php -v所显示的默认CLI版本。

composer --version 第一行就暴露真实 PHP 环境
别信 php -v,它只告诉你默认 CLI 版本;composer --version 才是唯一能确认 Composer 当前实际运行在哪个 PHP 上的命令。输出第一行会明确写成类似:PHP 8.2.15 (cli),括号里的 cli 表示这是命令行环境,路径和版本都真实有效。
如果这行显示的不是你期望的版本(比如项目要求 PHP 8.1,却显示 7.4),说明 Composer 正在用错的解释器跑——后续所有 install、update 都可能生成不兼容的 vendor/ 文件。
- 运行
head -n1 $(which composer)查 shebang:若为#!/usr/bin/env php,则取决于$PATH中第一个php;若为#!/usr/bin/php8.1,就是硬编码绑定 - 二者输出必须一致,否则
composer --version和实际执行时用的 PHP 可能不同 - Windows 用户注意:
where composer可能返回composer.bat,这时要打开它看里面调用的是哪个php.exe
composer show --platform 显示当前 PHP 和扩展真实状态
composer show --platform 不查配置、不走缓存,直接读取当前 PHP CLI 进程加载的扩展列表和版本号。它能立刻告诉你:ext-gd 是否启用、openssl 是否可用、php 版本是否 ≥ 项目 require 的最低值。
这个命令特别适合排查“明明装了扩展却报 ext-gd could not be found”这类问题——往往是因为 CLI 的 php.ini 和 Web 环境(如 PHP-FPM)的配置文件完全独立,CLI 没开 gd,但网站能跑,Composer 却卡住。
- 输出中
php行的版本号必须满足项目composer.json中"require": {"php": ">=8.1"}的约束 -
ext-xxx条目若显示disabled或压根没出现,说明该扩展未被当前 PHP CLI 加载 - 它不识别
config.platform,所以结果 100% 反映真实运行能力,不是“假装有”
composer diagnose 全面扫描多版本共存下的健康隐患
composer diagnose 是唯一能一次性验证多版本共存场景下所有关键环节是否就绪的命令。它不安装包、不改文件,但会检查:PHP 版本是否达标、openssl/curl/zlib 是否启用、CA 证书是否可信、缓存目录是否可写、镜像源是否连通。
尤其当你的系统装了多个 PHP(如 /usr/bin/php8.1、/usr/bin/php8.2),而 Composer 被软链到某个固定路径时,diagnose 会暴露那些隐藏问题:比如 open_basedir 限制了缓存目录、或 COMPOSER_HOME 指向了一个不存在的路径。
- 加
-v参数(composer diagnose -v)能看到每项检测的具体路径和判断依据 - 国内用户重点看
repo.packagist是否指向镜像地址(如https://mirrors.aliyun.com/composer/),否则即使配了也白搭 - 如果提示
The openssl extension is required,不要重装 Composer,而是去php --ini显示的php.ini里取消extension=openssl前的分号
多版本共存时 vendor 必须按 PHP 版本重装
很多人以为换完 PHP 版本、改完 config.platform 就万事大吉,结果运行时报 Class not found 或语法错误。根本原因是:vendor/composer/autoload_static.php 等文件是在 composer install 时由当前 PHP 解释器动态生成的,PHP 8.2 生成的代码在 PHP 8.1 下可能因新语法(如 match 表达式)直接解析失败。
这不是“建议”,是硬性要求:只要 PHP 主版本或小版本变更(如从 8.1.8 升到 8.2.0),就必须删除 vendor 和 composer.lock,再用目标 PHP 显式执行安装。
- 正确做法:
/usr/bin/php8.2 composer.phar install(Linux/macOS)或"C:\php\php-8.2\php.exe" composer.phar install(Windows) - 别用
alias composer='php8.2 composer'—— Git hooks、Makefile、非交互 shell 中大概率失效 -
COMPOSER_PHP环境变量只对原生composer二进制有效;如果which composer返回的是 shell 脚本,它就不起作用
composer 的 CLI 版本,根本不是一回事。哪怕 composer diagnose 全绿,info.php 里看到的 Web 环境 PHP 版本不对,项目照样起不来。


















