composer check-platform-reqs --no-dev 是生产部署前必须执行的纯读取环境校验命令,只检查 composer.json 中 require 声明的 PHP 版本、扩展及 INI 设置是否满足,不触碰 require-dev,且受 config.platform 干扰,需显式覆盖或删除该配置以确保校验真实环境。

它只检查 composer.json 里 require 声明的 PHP 版本、扩展和 INI 设置是否满足,不碰 require-dev 里的任何东西——这才是生产部署前该用的预检命令。
为什么 composer install --no-dev 不能代替 check-platform-reqs --no-dev
因为 install --no-dev 是“边装边试”,失败时可能已部分写入 vendor,错误信息也常被网络超时、权限问题或包冲突掩盖;而 check-platform-reqs --no-dev 是纯读取校验,不改文件、不联网、不解析依赖图,失败即停,输出直指根源:
-
ext-xml is missing→ 不是没装 php-xml 包,是php.ini没启用extension=xml -
php (>=8.1) is required, but 8.0.30 is installed→ PHP 版本硬不匹配,升级或换容器镜像 -
memory_limit = 16M→ 即使扩展全齐,composer install也可能因内存不足崩在 autoload 生成阶段
check-platform-reqs --no-dev 会受 config.platform 干扰吗
会,而且这是最容易踩的坑。如果 composer.json 里写了:
"config": {
"platform": {
"php": "7.4.33",
"ext-gd": "*"
}
}那么 check-platform-reqs --no-dev 就按这个“假定环境”去校验,而不是你服务器上真实的 PHP 8.2 和已启用的 ext-gd。结果就是:明明环境 OK,却报错 “php (7.4.33) is required, but 8.2.10 is installed”。
解决方法只有两个:
- 删掉
config.platform(除非你真需要它做兼容性兜底) - 加
--platform=php:8.2.10显式覆盖模拟值,让它对齐真实环境
CI/CD 流水线里怎么安全集成这步校验
别把它塞进 composer install 同一个脚本里。必须拆成独立步骤,并设为失败即中断:
composer check-platform-reqs --no-dev || exit 1
注意三点:
- 加
--fail-on-missing让输出更干净,只留未满足项 - 别信
php -m | grep redis—— 它只查模块名,不验证ext-redis是否真能被 Composer 识别(比如extension_dir路径错或权限不对) - 某些 PaaS(如 Laravel Vapor)默认禁用
ext-opcache或ext-apcu,check-platform-reqs会如实报出,但你得自己判断这些是不是运行时刚需
真正容易被忽略的不是“缺什么”,而是“它校验的范围比你以为的小”:它不看 composer.lock 里间接拉进来的扩展要求,也不管 php.ini 里 disable_functions 锁了哪些函数——那些得靠后续的单元测试或 smoke test 补位。


















