composer check-platform-reqs 与 composer-lock-diff 职责分离:前者校验 composer.json 显式声明的 php/扩展是否匹配当前 cli 环境,后者仅对比两个 composer.lock 文件差异;二者不联动、不嵌套、不协同验证升级。

直接说结论: composer check-platform-reqs 和 composer-lock-diff 是两类工具,不能“配合”实现平滑升级——前者校验 PHP 环境是否满足 composer.json 声明的平台要求,后者是第三方 diff 工具(如 composer-lock-diff CLI 或 diff 脚本),只用于对比两个 composer.lock 文件的差异。它们职责不重叠、不联动、不嵌套调用。
为什么不能把 check-platform-reqs 当作升级前检查环节?
它只做一件事:读取当前 PHP CLI 环境(phpversion()、extension_loaded()、ini_get()),比对 composer.json 中 require 和 config.platform 的显式声明。它不关心 composer.lock 里装了什么包,也不校验已安装包是否兼容新 PHP 版本——比如你 lock 里有个 monolog/monolog v2.10,它依赖 ext-json,而你系统关了 json 扩展,check-platform-reqs 不会报这个错,因为它没在 composer.json 的 require 里写 "ext-json": "*"。
- 它不扫描 vendor 目录里的实际代码或运行时依赖
- 它不检测间接依赖(如
laravel/framework引入的symfony/console)是否缺失扩展 - 它对
config.platform.php的值完全盲从,哪怕你本地是 PHP 8.3,config.platform.php设为"8.1.0",它就按 8.1 校验
composer-lock-diff 的真实用途和限制
composer-lock-diff(常见于社区脚本或自建工具)本质是解析两个 composer.lock 文件,输出新增/删除/升级的包名与版本。它不执行任何校验逻辑,也不触发 Composer 内部解析器。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它无法告诉你某个包升级后是否需要新扩展(比如
guzzlehttp/guzzlev7 → v8 可能弃用ext-curl改用ext-http) - 它不感知 PHP 版本变化,也不会标出哪些变更来自
--with-all-dependencies - 若你用
composer update --dry-run生成预估 lock,再拿去 diff,那只是“预期变更”,不是真实环境验证结果
真正该做的三步交叉验证
想确保升级平滑,必须分层验证,每步解决不同问题:
- 环境层:先跑
composer check-platform-reqs,确认composer.json显式要求的 PHP 版本、扩展、INI 设置全满足——这是上线前最后一道静态门槛 - 依赖层:升级 PHP 后,必须执行
composer update --with-all-dependencies(非普通update),否则 lock 里仍存旧 PHP 下解析出的包,可能含废弃扩展调用 - 运行层:删掉
vendor/,重新composer install,然后手动触发关键路径(如 API 请求、队列任务),观察是否出现Call to undefined function或Class not found—— 这才是最终判决
最容易被忽略的一点:很多团队把 check-platform-reqs 当成“万能体检”,却忘了它只认 composer.json 里白纸黑字写的约束。漏声明 = 漏检查,而漏声明的包,往往就是上线后第一个报错的。










