config.platform 必须嵌套在 config 对象内,格式为 "config": {"platform": {...}};若置于根层级则被忽略,导致“platform not applied”错误。

config.platform 必须嵌套在 config 里,不能放顶层
很多人写完 composer.json 后执行 composer install 报错“platform not applied”,其实是把 platform 直接写在了根对象下。Composer 只认 "config": { "platform": { ... } } 这种结构。
常见错误写法:
{
"platform": { "php": "8.1.0" },
"require": { ... }
}
正确写法:
{
"require": { ... },
"config": {
"platform": {
"php": "8.1.25",
"ext-xdebug": true,
"ext-pcntl": true
}
}
}
-
platform不是全局配置项,也不是命令行参数,它只在composer install和composer update解析依赖时起作用 - 值必须是对象,不能是字符串或数组;
"ext-gd": "1"和"ext-gd": true都合法,但"ext-gd": "^8.1"会直接被忽略 - 扩展名必须带
ext-前缀,且大小写、连字符要和php -m输出完全一致(比如ext-xdebg❌,ext-xdebug✅)
platform.php 和真实 PHP 版本不一致时,install 仍能跑,但运行可能崩
config.platform.php 只骗过 Composer 的依赖解析器,不改变实际执行环境。你用 PHP 8.3 装出的包,如果依赖 enum 或 match 表达式,放到 PHP 8.1 上运行就会报错——platform 挡不住这个。
所以别靠它“降级开发体验”:本地是 PHP 8.3,却设 "platform": {"php": "8.1.0"},结果 composer.lock 里装了兼容 8.1 的旧版 symfony/console,但你的代码用了 8.3 的新语法,部署后直接 Fatal error。
- 真正安全的做法是:用目标环境的 PHP 执行
composer update --lock,比如/usr/bin/php81 composer update --lock - 若需同时支持 PHP 8.1 和 8.2,
composer.json中应写"php": "^8.1 || ^8.2",并验证所有 require-dev 工具(如phpunit)确实双版本兼容 -
composer install本身不校验运行时 PHP 版本,只按 lock 文件装包;报错通常发生在第一次require autoload.php或运行时调用新语法时
ext-* 平台伪装不是万能的,有些扩展根本绕不过
config.platform.ext-* 能让 Composer 忽略扩展缺失,但前提是:该扩展只出现在 require 或 require-dev 的约束里,而不是在运行时被硬编码加载。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
典型踩坑场景:
-
ext-redis写在require里 → 设"ext-redis": true就能过安装 - 但业务代码里写了
new Redis(),而生产环境真没装redis.so→Class 'Redis' not found,platform完全无效 -
ext-sodium在 PHP 7.2+ 是内置的,但 Alpine Linux 默认不编译进 PHP →platform设true能过 install,运行时仍可能因缺失符号报sodium_init(): Unable to initialize sodium
更稳妥的做法是:用 composer platform-check 提前验证,或在 Dockerfile 里显式安装扩展,而不是靠 platform 掩耳盗铃。
--ignore-platform-reqs 是最后手段,慎用
当你确定某扩展(如 xdebug)只用于本地调试、线上绝不会加载,又不想在 composer.json 里维护多套 platform 配置,可以用 --ignore-platform-reqs。
但它会跳过所有平台检查,包括 php 版本、ext-*、甚至 lib-* 约束。CI 脚本里写 composer install --ignore-platform-reqs,等于主动放弃版本护栏。
- 推荐替代方案:
COMPOSER_PLATFORM_CHECK=0 composer install --no-dev,只关扩展检查,保留 PHP 版本校验 - 或者更干净:把
xdebug移到require-dev,然后线上用composer install --no-dev,天然规避 -
--ignore-platform-reqs应该只出现在临时调试命令中,绝不进 CI/CD 脚本或 Dockerfile
真正容易被忽略的是:platform 配置不生效时,第一反应不该是加 --ignore-platform-reqs,而是先确认 head -n1 $(which composer) 看 shebang 是否指向你要的那个 PHP —— 很多时候问题根本不在这儿。










