check-platform-reqs仅校验当前cli环境是否满足composer.json中显式声明的php版本、扩展及ini设置,不覆盖微服务多运行时、多sapi、多容器的实际差异,也无法检测未声明依赖或扩展功能完整性。

它不能直接检测微服务环境的兼容性,只能校验当前 CLI 环境是否满足 composer.json 里显式声明的平台要求——而微服务通常跨多个运行时、多个 PHP 版本、多个扩展集,这个命令一次只查一个进程上下文。
为什么在微服务里跑 check-platform-reqs 容易误判
微服务不是单体项目,每个服务可能有独立的 composer.json、PHP 版本、扩展配置甚至 SAPI 类型(CLI / FPM / Apache)。但 check-platform-reqs 只做三件事:读当前目录的 composer.json、调用当前 shell 下的 PHP CLI 二进制、执行 phpversion() 和 extension_loaded()。它完全不知道其他服务是否存在、FPM 是否启用了 ext-redis、Docker 容器里 php.ini 是否加载了 opcache。
- 你在宿主机上执行,它检查的是宿主机 PHP,不是容器内 PHP ——
which php和docker exec -it svc1 php -v经常不一致 - 你进了容器执行,它只反映该容器当前 CLI 环境,不代表 FPM 进程实际加载的扩展(
php-fpm和php可能用不同php.ini) - 某个服务依赖
ext-amqp,但composer.json没写"ext-amqp": "*"→check-platform-reqs完全不报,等php artisan queue:work启动时报Class 'AMQPConnection' not found
check-platform-reqs --no-dev 在部署流水线中怎么用才不翻车
它适合放在 CI/CD 的「构建后、部署前」环节,但必须和目标运行时对齐。否则就是拿 A 环境测 B 环境。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在 GitHub Actions 或 GitLab CI 中,先
docker build出镜像,再docker run --rm <image> composer check-platform-reqs --no-dev</image>—— 这样查的是镜像内真实的 PHP CLI - 如果服务用多阶段构建(如
FROM php:8.2-cli构建 +FROM php:8.2-fpm运行),必须在最终运行镜像里执行,而不是构建镜像 - 删掉
composer.json里的"config": {"platform": {...}},除非你明确想模拟旧环境;否则它会强制用假版本比对,掩盖真实不兼容 - 加
--fail-on-missing让失败更明显,避免因输出滚动被忽略
真正要查微服务运行时兼容性,还得补这几步
check-platform-reqs 是起点,不是终点。它告诉你「声明的东西有没有」,但微服务崩溃往往发生在「声明之外的地方」。
- 每个服务启动后,暴露一个
/health/platform接口,里面调用extension_loaded('pdo_pgsql')、ini_get('memory_limit')、function_exists('curl_init')—— 这才是 FPM 实际看到的环境 - 用
php -i | grep 'Loaded Configuration File'和php --ri pdo_pgsql确认扩展是否在对应 SAPI 下启用,别只信php -m - 检查
composer.lock里各包的require字段:比如guzzlehttp/guzzle自身composer.json要求"ext-json": "*",但你的服务没声明 →check-platform-reqs不查,除非加--with-dependencies - CI 中跑
composer check-platform-reqs --no-dev --with-dependencies,虽然慢一点,但能穿透到已安装包的平台约束,更贴近真实依赖链
最常被忽略的一点:它不验证扩展功能完整性。比如 ext-intl 加载成功,但 ICU 库版本太低,Collator::create() 运行时报错 —— check-platform-reqs 通过,服务上线后才崩。










