composer check-platform-reqs 是 Composer 2.2+ 内置的环境体检工具,用于静态校验当前 PHP 环境(版本、扩展、INI 设置)是否满足 composer.json 中显式声明的平台要求;它不绕过检查,不探测未声明依赖,不读锁文件,也无法发现漏声明扩展、拼写错误或运行时配置问题,故需配合 --lock 和真实环境验证。

composer check-platform-reqs 是什么,它能帮你避开哪些坑
它不是“绕过检查”的命令,而是你在 composer install 或上线前该主动跑一遍的「环境体检工具」。它只读 composer.json 中显式声明的 PHP 版本、扩展(如 ext-gd)、甚至 config.platform 里的模拟配置,不探测你代码里硬写的 curl_init() 却没在 require 里写 ext-curl —— 这类漏声明 = 漏检查,运行时直接报错。
常见误判场景包括:
- 本地
php -v显示 8.2,但 Composer 实际调用的是另一个 PHP(比如 MAMP 自带的 8.0),check-platform-reqs检的其实是后者 -
config.platform.php被设为"8.1.0",命令就按这个验,完全忽略你系统真实版本 - 扩展名拼错(如
ext-mbstring写成mbstring)或config段落名打错("platfrom"),命令静默跳过,不报错也不提醒
怎么运行才真正有效:路径、权限和 PHP 环境
必须在含 composer.json 的项目根目录执行,否则报 Could not find composer.json。Composer 不会向上查找父目录,也不会读全局配置。
确保你用的是 Composer 2.2+(composer --version 确认),旧版无此命令。
关键细节:
- 运行前先确认
which php和php -v输出是否与你预期一致;如果开发环境有多个 PHP(CLI / FPM / Docker),check-platform-reqs只认当前 shell 下的php命令 - 想强制按真实环境检查?临时注释掉
composer.json里的"config": {"platform": {...}}段再跑 - 加
--no-dev参数可跳过require-dev中的平台要求(适合部署时精简校验)
看懂输出结果:哪些提示真危险,哪些可以忽略
输出格式统一为:ext-zip * required, you have none 或 php >=8.1 required, you have 8.0.30 —— 左边是约束,右边是现状,中间是结论。
注意这些容易被轻视的点:
-
you have none表示扩展根本没加载,查php -m | grep zip,别只信phpinfo()页面(那是 FPM 环境) -
you have 8.0.30但要求>=8.1,说明 CLI PHP 版本不够,得换php命令路径或重装 CLI 版本 - 没任何输出 ≠ 环境完美:它不检查
php.ini里的memory_limit、opcache.enable等运行时设置,这些得单独用php -r 'var_dump(ini_get("memory_limit"))'验证 - 它不校验扩展的子版本(比如
mbstring的 ICU 版本差异),而某些包在 PHP 8.2+ 上因 ICU 行为变更会静默出错
它和 composer install 的平台检查有什么区别
composer install 默认开启 platform-check(Composer 2.2+),但它结合 composer.lock 中锁定的依赖版本做二次校验;而 check-platform-reqs 是纯静态检查,不读 vendor/、不碰锁文件、不下载包。
这意味着:
- 如果
composer.lock里锁着一个只兼容 PHP 8.0 的包,但你本地是 PHP 8.3,install可能失败,而check-platform-reqs却显示 OK(因它只看composer.json声明) -
check-platform-reqs适合 CI/CD 流水线早期快速拦截明显不匹配;install才是最终落地验证 - 上线前别只信
check-platform-reqs的 OK —— 一定要在目标环境(同 PHP 版本、同扩展、同php.ini)下跑一次真实composer install


















