composer diagnose 能查 composer.json 语法、vendor 权限、openssl/zip 扩展、CA 证书、GitHub API 连通性;不能查依赖能否安装、PHP 版本约束、autoload 是否生效、require-dev 包兼容性。

composer diagnose 能查什么,不能查什么
composer diagnose 是 Composer 自带的轻量级环境自检命令,它不安装包、不解析依赖、也不跑 autoload,只检查你当前能不能“安全地执行 install/update”。它能告诉你:composer.json 语法是否合法、vendor/ 目录权限是否正常、openssl 和 zip 扩展有没有启用、CA 证书路径对不对、GitHub API 能不能通——但不会验证你写的 require 是否真能装上,也不会测试插件是否兼容。
常见误判场景:
- 在项目子目录里运行,提示 [FAIL] No composer.json present → 实际是你没进对根目录
- 共享主机禁用了 proc_open(),输出里一堆 Skipped → 不是通过了,是压根没测成
- composer.json 里写了 "php": "^8.2",但本地 PHP 是 8.1,diagnose 完全不报错 → 它不管版本约束冲突
怎么运行才有效:路径、权限、环境变量
必须在含 composer.json 的项目根目录下运行,它不会向上查找。如果提示 [FAIL] vendor directory is not writable,别急着 chmod -R 777 vendor,先确认是不是用错了用户(比如 root 写的,www-data 读不了);如果是 Docker 或 CI 环境,可能需要显式设置 COMPOSER_HOME 或 COMPOSER_CAFILE。
典型修复动作:
- export COMPOSER_CAFILE=/etc/ssl/certs/ca-certificates.crt(Debian/Ubuntu)
- export COMPOSER_HOME=~/.composer(避免权限混乱)
- Windows 上若报 openssl extension not loaded,检查 php.ini 中 extension=openssl 是否取消注释,且路径下存在 php_openssl.dll
遇到 [FAIL] GitHub API is not working 怎么办
这个失败最常被当成网络问题,其实大概率是认证或限流导致。Composer 默认每小时只能发 60 次未认证请求到 api.github.com,一旦超限就卡住。
排查步骤:
- 运行 curl -I https://api.github.com/rate_limit,看返回头里 X-RateLimit-Remaining 是否为 0
- 检查 ~/.composer/auth.json 是否存在,里面是否有有效的 github-oauth token
- 若没有,生成 token 后手动写入,或用 composer config --global github-oauth.github.com your_token_here
- 注意:token 权限至少要勾选 public_repo,否则仍会失败
为什么加 -vvv 有时反而看不出问题
composer diagnose -vvv 会输出更详细的检测过程,但它本质还是走同一套检查逻辑,不会增加新检测项。如果你已经看到 [FAIL] The openssl extension is missing,再加 -vvv 只会多打印几行加载路径,解决不了根本问题。
真正该做的:
- 先看 php -m | grep openssl 确认扩展是否真的启用
- 如果启用了但 diagnose 还报错,说明 Composer 正在调用另一个 PHP 二进制(比如系统自带的老版本),用 which php 和 composer diagnose --no-ansi | head -n5 对比 PHP 路径
- -vvv 更适合配合 composer install 或 update 时定位下载中断、重定向异常等链路问题,不是 diagnose 的常规用法
最容易被忽略的一点:它不检查 autoload 配置是否生效,也不验证 require-dev 包能否加载。也就是说,diagnose 全绿,不代表你的 PHPUnit 测试一定能跑起来——那得靠 composer dump-autoload 和实际执行来验证。










