Composer 的 platform 配置仅在 composer update 时生效,用于声明目标环境的 PHP 版本与扩展,必须置于 config 对象内且格式严格;写错不报错但静默失效,需删 lock 和 vendor 重装验证。

Composer 的 platform 配置不是“让 PHP 变成另一个版本”,它只在 composer update 时起作用——告诉 Composer:“请按这个 PHP 版本和扩展列表去选包”,其他时候完全不干预。
platform 必须写在 composer.json 的 config 对象里
常见错误是把它扔到顶层、require 下,或者拼错 key 名。只有下面这种结构才生效:
{
"require": { "monolog/monolog": "^3.0" },
"config": {
"platform": {
"php": "8.1.25",
"ext-mbstring": "*",
"ext-openssl": "*"
}
}
}
错误写法包括:"platforms"(多一个 s)、"platform.php"(点号非法)、"platform": "8.1.25"(必须是对象,不能是字符串)。写错后 Composer 不报错,但配置静默失效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 改完必须删掉
composer.lock和vendor/,否则旧锁文件会缓存之前解析结果 - 运行
composer show -p php可验证当前生效的伪装 PHP 版本 - 扩展名必须和
php -m输出一致,比如ext-gd不能写成gd或ext-gd.so
为什么必须写具体小版本,比如 "8.1.25" 而不是 "^8.1"
Composer 解析 ^8.1 时可能当作 8.1.99 处理,导致它选了一个只在 PHP 8.2 才有的函数(比如 str_starts_with())的包版本,而你的目标环境其实是 8.1.25 —— 运行时报错,但 composer update 却没拦住。
- 扩展版本值可以是任意非空字符串(
"1"、"present"、"8.1.25"都行),Composer 只检查是否存在,不校验语义 - 如果项目 require 里写了
"php": "^8.1",你 platform 设成"8.0.0",composer update会直接失败:约束冲突 - 宝塔或 Docker 多 PHP 环境下,
platform再准也没用——真正执行composer install的 PHP 二进制路径才是关键,先查which php,再确认对应/www/server/php/82/bin/php -v
platform-check-file 是什么,什么时候要用
这是 Composer 2.5+ 引入的高级选项,适用于 CI/CD 中“真实 PHP 环境混乱但目标明确”的场景。比如 GitHub Actions 里用 shivammathur/setup-php 装了 PHP 8.1,但宿主机 php -v 是 8.0 —— 此时 Composer 默认会先检测真实环境,失败就退出,根本读不到你的 platform。
- 必须同时设置
"platform-check": false,否则platform-check-file不生效 -
platform-check-file指向一个 JSON 文件,内容格式和config.platform完全一样 - 它不替代
platform,而是绕过真实环境检测的兜底机制;日常开发几乎用不到
别把 platform 当运行时补丁
设了 "ext-sodium": "*",不代表生产服务器上 php -m | grep sodium 就真有;设了 "php": "8.2.0",也不代表 php -v 会变。它只影响依赖选择逻辑,而运行时是否崩,取决于真实 PHP 版本、已加载扩展、以及函数是否存在。
- 宝塔中每个 PHP 版本的扩展要单独勾选启用,不是“装一次,全版本生效”
- 本地开发用 Xdebug,但生产禁用?可以加
"ext-xdebug": "3.0.0"到 platform,配合--no-dev避免误装带调试依赖的包 - 团队协作时,
platform必须提交到 git,否则每人composer update结果可能不同

















