应配置 composer.json 的 config.platform.php 为目标 php 版本(如 "8.1.10"),并删除 composer.lock 和 vendor 后重装;platform 仅影响依赖解析,不解决运行时扩展缺失问题。

composer install 报错 “requires PHP >=8.1 but your PHP version is 7.4.33” 怎么办
这是 composer install 最常见的平台不匹配错误:项目 composer.json 中声明了高版本 PHP 依赖(比如 "php": "^8.1"),但当前 CLI 环境的 PHP 版本低于要求。Composer 默认按运行它的 PHP 版本做校验,不是按你最终部署环境的版本。
解决思路不是“升级本地 PHP”(往往不可行),而是告诉 Composer:“我知道我本地是 7.4,但我目标是生成适配 8.1 的锁文件和 vendor”。关键靠 platform 配置:
- 在
composer.json根级加"config"字段,内嵌"platform" -
"platform"里只写你**目标环境**的 PHP 版本,例如:{"php": "8.1.10"} - 这个值会覆盖当前 CLI 的
PHP_VERSION,影响依赖解析、版本约束判断和composer.lock生成 - 执行前务必删掉
composer.lock和vendor/,否则旧锁文件会干扰
platform 配置写在哪?config.platform 还是 config.platform.php?
必须写在 "config" 对象下,且键名就是 "platform" —— 不是 "platform.php",也不是 "php-platform"。常见错误是拼错键名或层级放错。
正确位置示例:
立即学习“PHP免费学习笔记(深入)”;
{
"require": {
"monolog/monolog": "^2.8"
},
"config": {
"platform": {
"php": "8.1.10"
}
}
}
注意:"platform" 是 "config" 的直接子属性,不能嵌套在其他字段里;值必须是对象,不能是字符串;PHP 版本号建议写具体小版本(如 "8.1.10"),避免因 ^8.1 解析出意外版本。
platform 只能设 PHP 版本吗?扩展呢?
可以设扩展,但极少需要,且风险明确:Composer 仅用它做依赖兼容性检查,**不会帮你装扩展或验证是否真实存在**。
比如项目 require "ext-gd": "*",而你本地没开 GD,但想跳过校验,可写:
"config": {
"platform": {
"php": "8.1.10",
"ext-gd": "8.1.10"
}
}
但要注意:
- 扩展名必须用
ext-前缀,如ext-mbstring、ext-redis - 值填版本号或
*,但填*可能导致某些包误判为“已满足”而跳过兼容逻辑 - 线上环境若真缺该扩展,运行时仍会报错 ——
platform不解决运行时问题,只解决安装时依赖解析
为什么 vendor 里还是装了 PHP 8.2 专属的包?
因为 platform 只影响 composer install 和 composer update 时的依赖决策,不改变包内代码逻辑。如果某个包在 composer.json 中写了 "php": "^8.2",而你 platform 设的是 "8.1.10",Composer 会拒绝安装它(除非你加 --ignore-platform-reqs)。
真正容易被忽略的是:有些包通过 require-dev 或 conflict 间接引入高版本约束,或者用了 phpstan/psalm 这类工具包,它们的 PHP 要求可能比主业务代码更激进。这时光靠 platform 不够,得配合 --with-dependencies 或逐个查 composer show -t 定位源头。











