config.platform用于在composer update时模拟目标php环境选包,仅影响依赖解析;必须置于config对象内,格式为"config": {"platform": {"php": "8.1.25"}},且需手动声明扩展如"ext-mbstring": "*",改后须删lock和vendor重装验证。

直接说结论:用 config.platform 在 composer.json 里声明目标 PHP 版本和扩展,不是“切换本地 PHP”,而是让 composer update 按那个环境选包——它只管依赖解析,不管运行时。
platform 必须写在 config 对象里,位置错就完全失效
很多人改了半天没用,是因为把 platform 写到了顶层、require 下,或者拼成 platform.php。Composer 只认这个路径:
"config": { "platform": { "php": "8.1.25" } }
关键点:
-
platform是config的子对象,不能是字符串("platform": "8.1"❌) - 键名必须是
platform,不是platform.php、php-platform或其他变体 - 改完后必须删掉
composer.lock和vendor/,否则旧锁文件会缓存之前解析结果
只设 php 版本不够,扩展也得手动列全
platform 不读取你本地 php.ini,也不会自动补全 PHP 默认扩展。如果依赖要求 "ext-sodium": "*",而你只写了 "php": "8.1.25",composer install 依然报错。
常见需补全的扩展:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"ext-mbstring": "*""ext-openssl": "*""ext-curl": "*""ext-sodium": "*"
注意扩展名格式是 ext-xxx,不是 php-xxx 或 xxx;版本号填 * 或具体值都行,但建议用具体小版本(如 "8.1.25"),避免语义化版本解析偏差拉高依赖版本。
本地 PHP 版本低于 platform 声明值?Composer 会直接退出
这不是 bug,是设计行为:config.platform.php 不是用来“降级”开发环境的。如果你本地是 PHP 8.0,却在 composer.json 里设 "php": "8.1.25",composer install 会报错并中止。
适用场景其实很明确:
- 本地 PHP 版本 ≥ 目标环境(比如你在 PHP 8.2 上开发,但线上是 8.1)
- 你想提前暴露依赖兼容问题(比如某个包在 8.1 下不可用,但 Composer 默认按你本地 8.2 装了)
- CI/CD 中统一模拟生产 PHP 版本(配合
--no-dev验证 runtime 依赖是否干净)
别指望靠它在 PHP 7.4 机器上装 Laravel 10 —— 语法层面的错误(如 match 表达式)它拦不住,运行时照样崩。
宝塔、Docker、虚拟主机等环境要分清 platform 和真实执行路径
platform 再准,也救不了真实环境不匹配的问题。典型陷阱:
- 宝塔后台切了 PHP 8.2,但终端里
php -v还是 7.4 →composer install实际走的是 7.4,platform设再好,mb_strlen()也调不了 - Docker 构建时没指定 PHP CLI 路径,
which php返回的不是你期望的版本 - 虚拟主机没 SSH,没法跑
composer install→ 必须本地生成vendor/后上传,且确保composer.lock和php -v匹配
验证真实执行环境永远比配置 platform 更优先:先跑 which php 和 php -m | grep mbstring,再谈模拟。










