应配置 composer.json 中的 config.platform.php 为 "8.1.25" 等目标版本,仅影响依赖解析;若依赖扩展(如 ext-mbstring),需一并声明,但运行时仍须真实安装并启用对应扩展。

composer install 报错 “requires php ^8.1 but your repo does not satisfy that requirement” 怎么办
这是最常见场景:项目 composer.json 声明了 "php": "^8.1",但本地 PHP 是 8.0 或 7.4,composer install 直接失败。Composer 默认严格校验当前运行环境的 PHP 版本,不模拟、不绕过。
解决思路不是“降级项目要求”,而是让 Composer **假装**运行在目标 PHP 版本下——靠 platform 配置。
- 在项目根目录的
composer.json里添加"platform"字段(同级于"require") -
"platform"是 Composer 的“环境声明覆盖”,只影响依赖解析,不影响实际运行 - 它不会改你本地 PHP,也不会装新版本,只是告诉 Composer:“请按 PHP 8.1 的扩展和函数可用性来算依赖”
{
"require": {
"monolog/monolog": "^2.0"
},
"config": {
"platform": {
"php": "8.1.25"
}
}
}
platform.php 和 config.platform.php 有啥区别?哪个该用
没有 config.platform.php 这个东西——那是误解。只有 config.platform,它是 composer.json 里的一个对象字段,不是独立文件。
有人把 platform 写成 platform.php 是因为看到某些文档示例里 key 名叫 php,误以为是文件名;也有人想用全局配置,去改 ~/.composer/config.json,但那属于全局污染,不推荐。
立即学习“PHP免费学习笔记(深入)”;
- 项目级配置:写在项目
composer.json的"config": { "platform": { ... } }里,干净、可提交、CI 友好 - 全局配置:用
composer config -g platform.php 8.1,会影响所有项目,容易引发协作冲突 - 临时覆盖:命令行加
--ignore-platform-req=php,但会跳过所有 PHP 版本检查,可能装错扩展,慎用
platform 能模拟扩展吗?比如 sodium、mbstring
能,但得手动列全。仅配 "php": "8.1.25" 不代表自动带上 PHP 8.1 默认启用的扩展;Composer 不读取真实 php.ini,它只认你明确写的 platform 项。
如果依赖要求 "ext-sodium": "*",而你本地没装 sodium 扩展,光设 PHP 版本没用,照样报错。
- 补全常用扩展:在
"platform"里加"ext-sodium": "1.0"、"ext-mbstring": "8.1.25"等 - 版本号填什么不重要(Composer 只校验存在性),填
"*"也行,但建议填具体值,避免歧义 - 注意拼写:扩展名是
ext-xxx,不是php-xxx或xxx
"config": {
"platform": {
"php": "8.1.25",
"ext-sodium": "*",
"ext-mbstring": "*",
"ext-openssl": "*"
}
}
为什么 vendor/autoload.php 加载后还是报 Fatal error: Uncaught Error: Call to undefined function mb_strlen()
因为 platform 只管 Composer 安装阶段的依赖解析,不管运行时。它不能让缺失的扩展“变出来”。
报这个错说明:代码真调用了 mb_strlen(),但 PHP 运行时确实没加载 mbstring 扩展——platform 没骗过 PHP 解释器,只骗过了 Composer。
- 开发机必须实际安装并启用对应扩展(如 Ubuntu:
sudo apt install php-mbstring,然后确认php -m | grep mbstring) - Docker 用户注意:基础镜像是否含扩展?
php:8.1-cli默认不含mbstring,要自己docker-php-ext-install mbstring - CI 环境(如 GitHub Actions)需显式安装扩展,不能只靠
platform
platform 是“告诉 Composer 我有什么”,不是“给我变出什么”。缺扩展,该装还得装。











