composer check-platform-reqs仅校验composer.json中require和config.platform显式声明的php版本与扩展是否满足当前cli环境,不检查未声明依赖、web环境、扩展功能完整性或代码实际调用,故无报错≠项目可运行。

它只告诉你 composer.json 里写了什么、当前 CLI 环境能不能满足,不承诺项目能跑起来——没报错 ≠ 没问题,报错了 ≈ 真缺东西。
为什么 check-platform-reqs 报 ext-zip missing,但 php -m 能看到?
根本不是扩展没装,是 Composer 和你敲 php -m 用的压根不是同一个 PHP 二进制。
- 先执行
which php,确认当前 shell 默认调用的是哪个路径(比如/usr/bin/php或/opt/homebrew/bin/php) - 再用这个完整路径检查:
/opt/homebrew/bin/php -m | grep zip,而不是只敲php -m - macOS 上 Homebrew 安装的 PHP 常被系统自带旧版覆盖 PATH;Windows 下可能
C:\php\php.exe和C:\xampp\php\php.exe并存,扩展目录和 php.ini 完全不同 - 如果
composer.json里有"config": {"platform": {"php": "8.1"}},命令会按这个“假装”的版本校验,彻底绕过真实环境
check-platform-reqs 到底检查哪些字段?
它只读 composer.json 的两个地方:顶层 require 和 config.platform,其他一概无视。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须在项目根目录执行,否则报
Could not find composer.json;它不会向上查找父目录 -
require里写了"php": ">=8.1"或"ext-gd": "*",它才去比对;没写 = 不查,哪怕代码里硬调了imagecreate() -
config.platform是“虚拟环境”开关,设成"php": "8.2.10",它就只认这个值,和php -v输出无关 - 完全忽略
conflict、provide、require-dev(除非加--no-dev)、composer.lock里的平台约束
怎么让输出真正有用,而不是自欺欺人?
别指望命令自动修复,关键在声明规范 + 路径统一 + 场景隔离。
- 在
require里补全最低要求:"php": ">=8.1.0"(别用^8.1,check-platform-reqs对范围符支持弱) - 显式声明必需扩展:
"ext-zip": "*"、"ext-pdo_mysql": "*",*表示“只要 extension_loaded() 返回 true” - CI/CD 中可用
"platform"模拟目标环境,但本地开发建议删掉它,否则检查失去意义 - 加
--fail-on-missing只显示失败项;加--with-dependencies会读composer.lock,更严格但也更慢
最常被忽略的一点:它只调用 extension_loaded(),不验证扩展功能是否完整——比如 ext-intl 编译了但缺 ICU 库,check-platform-reqs 过了,运行时仍崩。










