composer check-platform-reqs 仅只读校验当前环境是否满足 composer.json 中声明的平台依赖(如 php 版本、扩展),不安装不修改;输出三列(package/required/installed),❌ 表示缺失或版本不符,✅ 表示满足,⚠️ 表示版本偏低;需配合 || exit 1 等方式在 ci 中强制拦截,无法自动修复或提示安装方法。

composer check-platform-reqs 不是用来“跳过”或“绕过”平台检查的命令,它只是**只读地列出当前系统环境是否满足 composer.json 中声明的 platform 依赖要求**。它不安装、不修改、不提示修复——它只告诉你“行不行”。很多人误以为运行它就能解决 phpunit 装不上或 ext-gd 报错的问题,其实不是。
为什么 check-platform-reqs 显示失败但 install 还是能跑?
因为 Composer 默认**忽略平台包(php, ext-*, lib-*)的缺失警告**,除非你显式加了 --ignore-platform-req 或配置了 platform-check。而 check-platform-reqs 是唯一强制校验并立即报错的命令。
- 它读取的是
composer.json里的"config": {"platform": {...}},不是你本地实际 PHP 版本或扩展 - 如果没配
platform,它就检查require里写的php和扩展约束(比如"ext-zip": "*") - 它不查
php.ini是否启用了扩展,只查extension_loaded()是否返回 true —— 所以ext-redis编译了但没写进php.ini,它会直接标红
check-platform-reqs 的输出怎么看?
输出分三列:Package(要求的平台包)、Required(composer.json 写的版本/存在性要求)、Installed(当前环境真实值)。关键看第三列是不是打叉或为空。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
ext-gd * ❌ php ^8.1 8.0.30
上面表示:项目要求任意版本 ext-gd,但当前 PHP 没加载;要求 PHP ≥8.1,但实际是 8.0.30 —— 这两个都会导致后续 composer install 在严格模式下失败。
- ✅ 表示满足;❌ 表示缺失或版本不符;⚠️ 表示存在但版本低于最低要求(比如要求
^8.2,实际是8.1.25) - 如果某行
Installed是disabled,说明扩展文件存在但被;extension=注释掉了 -
lib-curl这类系统库,它调用的是PHP_VERSION和dl()相关检测逻辑,不保证 100% 准确,尤其在 Alpine 容器里
怎么让 check-platform-reqs 真正起作用?
它本身不改变任何东西,要让它影响流程,得配合其他配置或脚本:
- CI 场景下,在
composer install前加一行composer check-platform-reqs || exit 1,避免构建产物带隐患 - 开发时想“假装”有某个扩展(比如本地没
ext-swoole但测试需要),可在composer.json的config.platform里硬声明:"ext-swoole": "5.0.0"—— 但注意:这只会骗过 Composer,运行时仍会Fatal error - 想临时跳过某项检查(如已确认
lib-icu版本低但不影响业务),用composer check-platform-reqs --ignore=lib-icu - 它不支持通配符忽略(
--ignore=ext-*无效),必须写全名
真正容易被忽略的是:这个命令不会告诉你「该装什么」,比如显示 ext-pdo_mysql 缺失,它不会提醒你该运行 sudo apt install php-mysql 还是 brew install php@8.2 —— 那得靠你根据 PHP 版本和操作系统自己查。它只负责说“门没开”,不开锁,也不递钥匙。










