composer check-platform-reqs仅校验composer.json中显式声明的php版本与扩展是否在当前cli环境中可用,不扫描未声明依赖、不检查web环境、不验证扩展功能完整性,故通过≠可运行。

直接运行 composer check-platform-reqs 没用,除非你先在 composer.json 里写清楚要检查什么。 它不是“自动扫描环境”的工具,而是“按你写的声明去比对”的校验器。没声明 PHP 版本或扩展,它就什么都不查;声明了但路径/配置不对,它就报 missing——而这往往和你直觉以为的“已安装”不一致。
为什么 check-platform-reqs 显示 ext-zip: * (missing),但 php -m | grep zip 能看到?
根本原因:Composer 和你执行 php -m 用的不是同一个 PHP 二进制文件或配置。
- 运行
which php查当前 shell 默认的 PHP 路径,再用它显式执行:/usr/bin/php -m | grep zip或/opt/homebrew/bin/php -m | grep zip - 确认 Composer 实际加载的
php.ini:php -i | grep "Loaded Configuration File",然后检查该文件是否启用了extension=zip.so - macOS 上 Homebrew 安装的 PHP 常被系统自带旧版(如
/usr/bin/php)覆盖 PATH,php -v看到的是新版本,但 Composer 启动时调用的仍是旧版 - Linux 下 apt 包和源码编译的 PHP,其
.so文件路径不同,CLI 和 Web SAPI 加载的扩展也彼此隔离,check-platform-reqs只认 CLI 环境
check-platform-reqs 真正检查什么、完全不管什么?
它只做两件事:读 composer.json 的 require 和 config.platform 字段,然后调用 extension_loaded() 和版本比对函数。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- ✅ 检查:
"php": ">=8.1.0"→ 调PHP_VERSION_ID比对;"ext-zip": "*"→ 调extension_loaded('zip') - ❌ 不检查:代码里实际调用了
openssl_encrypt(),但composer.json没声明ext-openssl—— 这种漏声明,它沉默 - ❌ 不检查:Web 环境(如 Nginx + PHP-FPM)是否启用同名扩展,
phpinfo()页面必须单独打开确认 - ❌ 不检查:扩展虽加载,但底层依赖缺失(如
ext-intl缺 ICU 库),运行时仍会崩
怎么让 check-platform-reqs 输出真正有用?
关键不在多跑几遍命令,而在规范声明 + 对齐真实环境。
- 在
composer.json的require里补全硬性要求:"php": ">=8.1.0"(别用^8.1,check-platform-reqs对范围符支持弱) - 显式列出项目运行必需的扩展:
"ext-zip": "*"、"ext-pdo_mysql": "*"、"ext-mbstring": "*" - CI/CD 中可用
"platform": {"php": "8.2.10"}模拟目标环境,但本地开发建议禁用该配置,否则容易掩盖真实兼容问题 - 验证当前 Composer 实际识别到的环境:
composer show --platform,它比php -m更准,能过滤掉仅注册未初始化的“幽灵扩展”
最常被忽略的一点:即使 check-platform-reqs 全绿,也不代表项目能跑起来。它不解析代码、不加载类、不触发 autoloader,更不验证扩展功能是否完整。上线前务必在目标环境(CLI + Web SAPI)分别验证关键扩展是否真能用。










