答案是运行 composer check-platform-reqs:它专用于静态校验当前 php 环境(版本、扩展、ini 设置)是否满足 composer.json 中 require 和 config.platform 的显式声明,不安装包、不解析依赖,结果精准且与运行时一致。

composer install 时提示“Your requirements could not be resolved”怎么办
这通常不是系统不满足要求,而是 Composer 在尝试安装时发现依赖冲突或 PHP 版本/扩展不匹配。真正检查运行要求,得绕过安装逻辑,直接查约束。
关键思路是:不执行安装,只解析 composer.json 中的 require 和 config.platform,再比对当前环境真实值。
- 运行
composer check-platform-reqs—— 这是 Composer 2.2+ 内置命令,专为这事设计,会逐条比对 PHP 版本、扩展(如ext-mbstring)、INI 设置(如memory_limit)是否达标 - 若提示缺失扩展,但实际已启用,先确认 CLI 使用的 PHP 配置是否和 Web 一致:
php -m | grep mbstring,php -i | grep 'Loaded Configuration File' - 若项目设了
"config": {"platform": {"php": "8.1.0"}},check-platform-reqs会按这个“假装”的 PHP 版本校验,而非真实版本 —— 这是故意为之,用于跨环境构建,但容易误判真实环境能力
为什么 composer diagnose 不报 PHP 扩展缺失
composer diagnose 只检查 Composer 自身配置和网络连通性,比如 composer.json 格式是否合法、CA 证书是否可用、vendor/ 权限是否正常,它完全不读取 require 里的 ext-* 条目。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
所以即使你缺 ext-gd,diagnose 依然显示 “OK”,但后续 install 必然失败。别用它代替平台检查。
- 真实检测必须用
check-platform-reqs(Composer ≥2.2) - 旧版 Composer(composer show --platform 看声明的平台要求,再手动比对
php -v和php -m - 注意:某些包在
require-dev里声明扩展,check-platform-reqs默认不检查 —— 加--no-dev参数可跳过,加--dev才包含
检查结果里出现 “missing” 但扩展明明已加载
常见于 Docker 或多 PHP 版本共存环境:Composer 调用的 php 命令路径和你终端敲 php -m 的不是同一个。
- 执行
which php和composer config --global --list | grep bin-dir,确认 Composer 是否用了全局配置的 PHP 路径 - 强制指定 PHP 解释器:
COMPOSER_BINARY=/usr/bin/php8.2 composer check-platform-reqs - Windows 用户注意:Git Bash 下
php可能指向 Windows 自带的 PHP,而 CMD 里是 WAMP/XAMPP 的 —— 检查前先php -v确认版本 - 某些扩展(如
ext-redis)需额外 INI 文件启用,php -m看不到,但php --ri redis能显示详细状态
CI/CD 流水线里自动化验证平台要求
在 GitHub Actions 或 GitLab CI 中,不能只靠 composer install 失败来发现问题 —— 错误信息太晚、太泛,定位成本高。
- 流水线第一步就加:
composer check-platform-reqs --no-dev(去掉 dev 依赖减少干扰) - 若用自定义 PHP 镜像,确保
Dockerfile中已docker-php-ext-install所有ext-*要求,而不是仅靠apt-get install php-mbstring—— 后者不保证 CLI 模式启用 - 注意
check-platform-reqs退出码:成功为 0,失败为 1 —— 可直接用于if判断,不必解析输出文本
config.platform 的覆盖效应和 CLI PHP 与 Web PHP 的分离 —— 两者不一致时,本地测试通过,上线就挂,而且错误堆栈还找不到源头。










