composer show --platform 显示的 php 版本与 php -v 不一致,是因为前者显示 composer 当前“认定的平台版本”,可能被 config.platform.php 配置或 composer_platform_check 环境变量覆盖,而非真实 cli 解释器版本。

composer show --platform 显示的 PHP 版本为什么和 php -v 不一样
它显示的是 Composer 当前「认定的平台版本」,不是你系统里真实的 PHP 解释器版本。这个值可能被 config.platform.php 覆盖,也可能受 COMPOSER_PLATFORM_CHECK 环境变量影响。
常见现象:
- 本地
php -v是 8.3.5,但composer show --platform输出php: 8.1.22→ 项目composer.json里写了"platform": {"php": "8.1.22"} - CI 流水线报错说 PHP 版本不够,但
php -v显示是 8.2 → 检查composer config --list | grep platform,很可能全局或项目配置了降级 - 输出里没有
php这一项 → 说明既没设config.platform.php,composer.json的require里也没声明php,Composer 就不显式记录
用 composer show --platform 查扩展是否启用
这个命令列出的是当前 CLI 环境下已加载的扩展(比如 ext-gd、ext-curl),不是 phpinfo() 页面或 Web SAPI 下的状态。Docker 或容器部署时尤其要注意:CLI 和 FPM 的 php.ini 常常不同。
关键点:
-
ext-gd [dev]表示该扩展只在 CLI 模式可用,Web 环境可能不生效 - 如果
composer install报ext-intl not found,先运行php -m | grep intl,别只看浏览器里的 phpinfo() - 某些镜像(如
composer:2)根本不带 PHP 解释器,composer show --platform会失败或返回空 —— 此时需确认执行命令的容器是否挂载了真实 PHP 环境
composer show --platform 和 platform-check 的关系
composer show --platform 输出的内容,就是 composer install 时 platform-check 实际比对的全部依据。它不校验网络、缓存或权限,只管「PHP 版本 + 扩展 + lib 库」这三类。
典型误判场景:
- 输出里有
ext-zip: 8.2.12,但composer install仍报错 → 检查该扩展是否真的支持 ZIP 格式(有些编译缺失 zlib 支持) -
lib-curl: 7.68.0显示正常,但依赖需要cURL >= 7.71.0→composer show --platform不显示 lib 的最小兼容要求,得靠composer why-not php:x.x或查包文档 - 加了
--verbose也看不到扩展的编译参数(比如 GD 是否支持 WebP)→ 这类细节得进 PHP 源码或用php -r "print_r(gd_info());"
如何让 composer show --platform 反映真实环境
默认行为已经尽量贴近真实 CLI 环境,但以下操作会干扰它:
- 删掉
composer.json中的"config": {"platform": {...}}段 - 确保没设置
COMPOSER_PLATFORM_CHECK=0环境变量 - 避免在 CI 脚本中用
composer install --ignore-platform-reqs后再查 —— 此时show --platform仍有效,但结果已失去约束意义
最稳妥的做法是:在目标环境中(比如生产服务器或 CI runner 容器)直接执行 composer show --platform,不要依赖开发机结果。环境差异永远比预期更隐蔽。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











