platform是composer在依赖解析阶段模拟php环境的配置,只影响composer update选包逻辑,不改变php -v输出或运行时行为,需正确配置在composer.json的config.platform下。

platform 是什么?它根本不是“切换 PHP 版本”的开关
platform 配置不会改你本地的 php -v 输出,也不会让 composer install 自动调用别的 PHP 二进制。它只干一件事:在依赖解析阶段,**假装当前环境是某个 PHP 版本+扩展组合**,从而影响 composer update 挑包的逻辑。
常见错误现象:
– 本地 PHP 是 8.3,但生产是 8.1,没配 platform,结果装了要求 php: ^8.2 的包,上线直接 Fatal error: Uncaught Error: Undefined constant "PHP_VERSION_ID"
– 配了 "platform": {"php": "8.1.0"},但 ext-sodium 在目标服务器根本没启用,运行时报 Class 'SodiumException' not found
-
platform只影响composer.lock生成和依赖版本选择,不干预运行时 - 它不检查扩展是否真实存在,只看你有没有在
platform里声明;没写,就当它不存在 - 如果你项目
require里写了"php": "^8.1",那platform设成"8.0.0"会导致composer update报错——因为约束冲突
怎么写才生效?位置、格式、版本号全得对
必须写在 composer.json 的 config 对象下,键名就是 platform,值是一个对象,不能是字符串,也不能嵌套错层级。
正确示例:
{
"require": { "monolog/monolog": "^3.0" },
"config": {
"platform": {
"php": "8.1.25",
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-curl": "*"
}
}
}
- 别写成
"platform.php"或"php-platform"—— 这些键名完全无效 - 版本号建议写具体小版本(如
"8.1.25"),避免"^8.1"被解析成8.1.99导致误判 - 扩展要显式列出,
"*"表示“假定已启用”,不是“自动检测”;没列的扩展,Composer 就当它不可用 - 改完后务必删掉
composer.lock和vendor/,否则旧锁文件会缓存之前解析结果,platform形同虚设
什么时候该用 platform-check-file?别乱配
platform-check-file 是 Composer 2.5+ 的高级选项,只适合 CI/CD 中「环境混乱但目标明确」的场景,比如 GitHub Actions 里用 shivammathur/setup-php 安装了 PHP 8.1,但宿主机 php -v 是 8.0 —— 此时你想跳过真实环境检测,靠静态快照驱动。
但它有两个硬性前提:
- 必须同时设置
"platform-check": false,否则 Composer 先跑真实检测,失败就退出,根本不会读你的文件 - 文件路径必须是相对
composer.json的合法路径,如./ci/platform.json;不能含~或环境变量 - 文件内容必须是严格 JSON:
{"php": "8.1.22", "ext-curl": true, "ext-json": true},键名大小写敏感,ext-前缀缺一不可
注意:platform-check-file 不解决扩展缺失问题,它只是绕过检测。如果 ext-gd 真没装,应用照样崩。
宝塔面板里 platform 为啥像没用?真相是执行路径没对上
你在宝塔网站管理界面选了 PHP 8.2,不代表终端里 php 命令就指向它。宝塔把不同版本 PHP 装在 /www/server/php/82/bin/php,而系统默认 php 往往是 /usr/bin/php(可能是 7.4 或 8.0)。
- 执行
which php和/www/server/php/82/bin/php -v对比,确认实际版本 -
platform配置再准,如果composer install底层调的是 PHP 7.4,那enum、match这类语法还是会报错 - 可靠做法是显式指定解释器:
/www/server/php/82/bin/php /usr/bin/composer install - 别改系统
/usr/bin/php软链——宝塔依赖它,一动容易整个面板失联
真正关键的永远是两件事:依赖解析阶段用 platform 控制选包逻辑,运行阶段确保 PHP 二进制和扩展跟生产一致。这两步漏掉任何一环,都可能让“本地能跑,线上炸锅”重现。











