composer install 突然报 platform 错误是因为 composer 2.2+ 默认启用平台检查,校验本地 php 版本及扩展是否满足 composer.json 中 require 或 config.platform 声明的要求;临时跳过可用 --ignore-platform-req=php(仅跳 php 版本)或 --ignore-platform-reqs(跳全部),永久禁用应仅限项目级配置 "platform-check": false 并配套运行时验证。

composer install 为什么突然报 platform 错误?
因为 Composer 2.0+ 默认启用平台检查(platform check),运行 composer install 或 composer update 时,会主动校验:php 版本、必需的 PHP 扩展(如 ext-curl、ext-xml)是否满足 composer.json 中 config.platform 或依赖包声明的最低要求。不满足就直接中断,不再继续安装。
怎么临时跳过平台检查?用 --ignore-platform-req
最常用且安全的方式是加 --ignore-platform-req 参数:
-
composer install --ignore-platform-req:跳过全部平台要求(PHP 版本 + 所有扩展) -
composer install --ignore-platform-req=php:只忽略 PHP 版本检查 -
composer install --ignore-platform-req=ext-gd:只忽略某个扩展(如ext-gd) - 可叠加使用:
--ignore-platform-req=php --ignore-platform-req=ext-xml
注意:--ignore-platform-req 是运行时开关,不修改配置,适合 CI/CD 构建或临时调试。它不会绕过 autoloader 加载逻辑,也不会影响已安装包的行为。
怎么永久禁用平台检查?别设 config.platform=null
很多人误以为在 composer.json 里写 "config": {"platform": {"php": null}} 就能关闭检查——实际无效。Composer 2.0+ 的平台检查基于两个来源:
- 依赖包自身声明的
require.php(如"php": "^8.1") - 你手动在
config.platform中覆盖的值(如"php": "7.4.33")
把 config.platform.php 设为 null 或空字符串,Composer 会忽略该字段,但依然会读取依赖包的真实要求。真正“永久跳过”的做法只有两种:
- 在项目根目录创建
composer.json的同级文件composer.local.json(Composer 不识别此文件,无用)→ 实际不可行 - 改用
COMPOSER_IGNORE_PLATFORM_REQS=1环境变量(等效于全局加--ignore-platform-req),但仅建议用于容器构建等受控环境
生产服务器上长期启用该变量,等于主动放弃兼容性防护,可能导致运行时 fatal error。
为什么 composer check-platform-reqs 显示失败,但 install 还是过了?
这是常见误解。composer check-platform-reqs 是独立诊断命令,只做检查、不触发安装;而 composer install 在解析依赖阶段才执行平台校验。二者行为不完全同步:
-
check-platform-reqs只看config.platform和当前 PHP 环境,不读取vendor/composer/installed.json或 lock 文件 -
install会结合 lock 文件中已锁定的包版本,再比对它们各自的require.php—— 如果 lock 文件里所有包都只要求php: ^7.4,而你当前是 PHP 8.2,那 install 仍会通过 - 所以,
check-platform-reqs报错 ≠install必然失败;反过来,check-platform-reqs通过,也不能保证update不出问题(因为 update 会尝试升到新版,可能拉入更高 PHP 要求的包)
真正需要警惕的是 composer update 前没跑 check-platform-reqs,结果在 CI 上卡住,或者上线后因扩展缺失直接 500。











