composer diagnose 检查 PHP 版本与必需扩展(json、phar、filter、hash、mbstring、openssl等)、allow_url_fopen 或 curl 配置、COMPOSER_HOME 可读写性、auth.json 合法性,不检查 autoload、vendor 权限、lock 文件一致性或项目级依赖问题。

composer diagnose 会检查哪些关键项?
composer diagnose 不是万能体检仪,它只聚焦 Composer 自身运行依赖的最小环境闭环:PHP 版本与扩展、网络连通性、本地配置有效性、缓存目录可写性。它不会检测你的项目代码是否能跑起来,也不会验证 autoload 是否正确映射类——那些得靠 composer dump-autoload -v 或实际 require 来暴露。
典型检查项包括:
-
php命令是否可用,且版本 ≥ 7.2(旧版 Composer)或 ≥ 8.1(Composer 2.5+) - 必需扩展:
json、phar、filter、hash、mbstring、openssl(缺任一即报错) -
allow_url_fopen开启,或已配置curl扩展(否则无法 fetch 包元数据) -
COMPOSER_HOME目录(默认~/.composer)是否可读写 - 全局
auth.json文件语法是否合法(若有)
为什么 diagnose 显示 OK 却 still 无法 install?
这是最常被误解的点:composer diagnose 通过 ≠ composer install 成功。常见脱节原因:
- 网络策略拦截了
packagist.org或镜像源(diagnose只测基础 HTTP,不测具体域名连通性) - 项目根目录下
composer.json里写了私有仓库但未配置repositories或认证凭据 -
vendor/已存在但权限混乱(diagnose不检查 vendor 目录) - PHP 运行时 ini 设置(如
memory_limit)过低,导致 install 过程 OOM,但 diagnose 本身轻量无压力
遇到这种情况,先加 -v 参数重试:composer install -v,错误堆栈里通常直接暴露是 DNS 解析失败、SSL 证书验证失败,还是 401 Unauthorized。
如何让 diagnose 检查更贴近真实使用场景?
默认 composer diagnose 是“干净启动”模式,不加载项目级配置。若要模拟实际命令行为,需显式指定上下文:
- 在项目目录中运行:
composer diagnose(自动识别当前composer.json和vendor/状态) - 强制跳过某些检查(仅调试用):
composer diagnose --no-interaction --no-plugins(禁用插件可排除第三方干扰) - 验证自定义镜像是否生效:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/ && composer diagnose(注意:diagnose 不校验镜像地址格式,但后续 install 会立刻报错)
特别注意:diagnose 不检查 composer.lock 一致性。锁文件损坏或与 composer.json 冲突,只有执行 composer update --dry-run 才会暴露。
诊断失败后该优先查哪几处?
看到 Checking platform settings: FAIL 或 Checking git settings: FAIL,别急着重装 Composer。按顺序快速定位:
- 运行
php -m | grep -E "(json|phar|openssl)",确认扩展真实加载(有些 Docker 镜像把openssl编译进内核但未启用) - 检查
php.ini中extension=openssl行是否被注释,或路径错误(php --ini查位置) - 测试基础 HTTPS 请求:
php -r "print file_get_contents('https://packagist.org/packages/list.json?limit=1');"(复现 diagnose 的网络检查逻辑) - 确认当前用户对
~/.composer有完整权限:ls -ld ~/.composer,常见于 root 安装后普通用户执行
真正棘手的往往是 PHP 扩展和系统 SSL 库版本不匹配(比如 Alpine Linux 的 musl + openssl),这时 diagnose 报的错很模糊,必须结合 php -i | grep openssl 和 ldd $(which php) | grep ssl 追底层依赖。


















