composer check-platform-reqs 仅校验 composer.json 中 require 和顶层 platform 字段声明的 PHP 版本与扩展,不检查代码实际调用的函数、Web/CLI 环境差异或扩展依赖的底层库版本。

composer check-platform-reqs 能告诉你当前 PHP 环境是否满足项目中显式声明的平台约束,但它不是万能体检报告——它只看 composer.json 里白纸黑字写的 php 版本和 ext-* 扩展要求,不查代码里实际调用的函数,也不管 Web 和 CLI 用的是不是同一个 php.ini。
怎么用 check-platform-reqs 查真实环境?
这个命令默认读取 composer.json 的 require 和顶层 platform 字段(注意:config.platform 是无效写法,会被忽略),然后拿你当前 CLI 下的 PHP 版本和已加载扩展去比对。
- 运行
composer check-platform-reqs前,先确认which php和 Composer 实际调用的是同一个二进制——常见坑是 macOS Homebrew 安装了新版 PHP,但系统 PATH 里/usr/bin/php还在前面 - 如果输出里有
ext-zip: * (missing),但php -m | grep zip看得见,大概率是 PHP CLI 二进制不一致,不是扩展没装 - 加
--no-dev参数可跳过require-dev中的平台检查,更贴近生产部署场景
为什么没报错,项目却跑不起来?
check-platform-reqs 只校验声明,不校验使用。很多包在 composer.json 里漏写了 ext-openssl,但源码里直接调用了 openssl_encrypt() —— 这种情况命令完全不报。
- PHP CLI 和 Apache/FPM 加载的扩展可能不同:CLI 下
php -m有mbstring,网页却报mb_strlen() not found,说明 Web 环境的php.ini没启用该扩展 -
platform字段若存在(如"platform": {"php": "8.1.0"}),命令会按这个“假版本”检查,而不是你本地真实的php -v输出 - 某些扩展依赖特定 ICU 或 OpenSSL 版本,
check-platform-reqs不验证这些运行时细节,只认名字和存在性
platform 字段到底在干什么?
它不是“要求环境必须是某版本”,而是“告诉 Composer:请按这个环境能力来解析依赖”。比如线上是 PHP 7.4,你本地是 8.2,但 platform 设为 "php": "7.4.33",Composer 就不会选那些只支持 8.0+ 的包版本。
-
platform必须是顶层字段,和require并列;写在config里等于没写 - 它的值只能是字符串(如
"8.1.0")或对象(如{"php": "8.1.0", "ext-gd": "*"}),不能是null或空字符串 - CI 场景下常用它锁定构建目标环境,但本地开发建议删掉,否则容易掩盖真实缺失的扩展
真正容易被忽略的是:check-platform-reqs 的 OK 不代表代码能跑通,它只是第一道静态过滤。上线前务必在目标环境(尤其是 Web SAPI)下跑一次 phpinfo(),并执行最小化脚本验证关键函数是否存在。











