使用 --ignore-platform-req=php 跳过 php 版本校验,或 --ignore-platform-reqs 彻底跳过所有平台检查;二者均不修改 lock 文件,推荐 ci 中用前者兼顾安全与兼容。

composer install 时提示 platform requirements mismatch 怎么办
这是 composer 在校验当前 PHP 环境与 composer.json 中 config.platform 或依赖包声明的 php 版本不匹配时抛出的典型错误,比如你在 PHP 8.1 上跑一个强制要求 "php": "^7.4" 的 lock 文件,又或者项目里写了 "platform": {"php": "7.4.33"},但本地是 PHP 8.2 —— composer 默认会严格拦截。
- 不是 bug,是 composer 的平台约束机制在起作用:它默认用你本地真实 PHP 版本去校验,但如果你通过
config.platform手动“伪装”了平台环境,就会触发校验失败 - 常见于 CI 构建、Docker 多版本切换、或团队共用一份 lock 文件但本地 PHP 版本不统一的场景
- 直接删
config.platform不现实(尤其当它是为兼容旧扩展或构建产物而设),也不能随便改php版本约束(可能破坏依赖解析逻辑)
用 --ignore-platform-req 或 --ignore-platform-reqs 跳过检查
这两个参数才是官方支持的绕过方式,区别很关键:
-
--ignore-platform-req=php:只忽略 PHP 版本检查,其他平台依赖(如ext-gd、lib-curl)仍会校验 -
--ignore-platform-reqs:彻底跳过所有平台相关检查(包括php、扩展、lib),风险更高但最干脆 - 它们只影响
install和update阶段,不影响 autoload 或运行时;不会修改composer.lock,也不会改变依赖解析结果 - CI 中推荐用
--ignore-platform-req=php,既解决问题又保留扩展检查,避免漏掉真正缺失的扩展
示例:
composer install --ignore-platform-req=php
config.platform 设为 null 是无效的
有人试过在 composer.json 里写 "platform": {"php": null} 或空字符串,这不会生效 —— composer 会直接报错或静默忽略,null 不是合法的平台值。
- 合法的
platform值只能是字符串(如"8.1.0")或对象(如{"php": "8.1.0", "ext-zip": "1.2.0"}) - 想临时禁用 platform,唯一可靠方式就是命令行参数,而不是改配置
- 如果项目长期需要多 PHP 版本兼容,建议把
config.platform移到composer.local.json并 gitignore,由各环境自行维护
为什么不用 --no-scripts + --no-plugins?
这两个参数和平台检查无关:--no-scripts 是跳过 scripts 里的钩子(如 post-install-cmd),--no-plugins 是禁用插件,它们既不干扰平台校验,也不能让 composer 忽略 php 版本不匹配。
- 混用这些参数容易让人误以为“加得越多越安全”,实际只是做了无用功
- 真正的平台绕过只有
--ignore-platform-req*系列参数,其他都是干扰项 - 某些旧版 composer(--ignore-platform-req,必须升级到 1.10+ 或用
--ignore-platform-reqs
平台约束本身不是障碍,而是 composer 试图帮你守住兼容底线。绕过它很简单,但得清楚自己绕过了什么——比如忽略 php 检查后,某个依赖里用了 match 表达式,而你本地是 PHP 8.0,那运行时才会暴露问题。










