答案是“reading composer.json”反复出现并非网络卡顿,而是composer正逐个读取本地path仓库或monorepo中各子包的composer.json,触发大量文件i/o与json解析;解决方法是禁用path扫描,而非换镜像。

为什么composer install -vvv里反复出现Reading composer.json
这不是网络卡,而是 Composer 正在逐个读取本地路径仓库("type": "path")或 Monorepo 中每个子包的 composer.json。每读一个,就触发一次文件 I/O 和 JSON 解析——几十个包叠加,光这一步就能吃掉数秒到数十秒 CPU 时间。
常见于以下场景:
- 项目用了
"repositories": [{"type": "path", "url": "./packages/*"}]通配写法 - Monorepo 工程中未禁用自动 path 扫描(Composer 默认开启)
-
composer.json里写了多个"type": "path"条目,且没加"options": {"symlink": false}
解决办法不是“换镜像”,而是关掉扫描:
- 全局禁用:
composer config -g repositories.path.type disabled - 项目级显式关闭:
"repositories": [{"type": "path", "url": "./packages/my-pkg", "options": {"symlink": false}}] - 用
--no-plugins临时排除干扰插件(如旧版fxp/composer-asset-plugin)
Directory Listing 请求根本不是 Composer 发起的
如果你在 Nginx/Apache 日志里看到大量 GET /packages.json 或 GET /p/xxx/ 后跟 403 Forbidden 或 404 Not Found,别急着调 Composer 配置——这些请求大概率来自浏览器、爬虫,或误配的 CI 脚本里裸写了 curl https://mirrors.aliyun.com/composer/packages.json 却没加 -I 或 --head。
Composer 本身从不发 Directory Listing 类请求;它只按需 GET 具体路径,比如:
-
https://mirrors.aliyun.com/composer/packages.json(元数据索引) -
https://mirrors.aliyun.com/composer/p/laravel/framework/2579b1a86e1c1f53230580928507105d3147e478.json(具体包信息) -
https://mirrors.aliyun.com/composer/dists/laravel/framework/2579b1a86e1c1f53230580928507105d3147e478.zip(dist 包)
若日志中大量出现 GET /、GET /p/、GET /dists/ 这类无后缀路径,基本可判定是外部工具或误操作导致,和 Composer 镜像配置无关。
repos.packagist 配错导致 fallback 到官方源做目录探测
当 Composer 没找到某个包的 provider 信息时,它不会直接报错,而是悄悄 fallback 到 packagist.org 尝试查——这个过程会触发对 https://packagist.org/packages.json 的请求,而该文件返回的是完整包列表(约 20MB+),下载+解析极其耗时。一旦发生,composer install -vvv 日志里就会混入 Downloading https://packagist.org/packages.json。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
典型诱因:
- 拼写错误:
composer config -g repo.packagist(少了个s)→ 实际应为repos.packagist -
镜像源已停更(如过时的
https://packagist.phpcomposer.com),返回 404,Composer 自动降级 - 新发布包尚未同步(延迟 5–30 分钟),镜像站返回空响应,Composer 回退
- 项目
composer.json中定义了"repositories"但漏了"packagist.org": false,导致元数据仍走官方源
验证方式:
- 执行
composer config -g repos.packagist,输出必须是完整 URL(如https://mirrors.aliyun.com/composer/) - 跑一次
composer install -vvv | grep -i 'packagist\|mirrors',确认所有packages.json请求都命中镜像域名
镜像站本身不提供 Directory Listing,但 CDN 缓存可能暴露路径
阿里云、腾讯云等镜像站明确禁用目录浏览(autoindex off),但部分企业自建镜像或老旧 Nginx 配置若开了 autoindex on,又没设好权限,就可能让 GET /p/ 返回 HTML 目录页——这不仅没用,还会被扫描器盯上,引发安全告警。
真正影响性能的,是这类请求触发的 CDN 缓存穿透:每次未命中缓存,都会回源到上游镜像站拉取 403 响应,增加延迟和带宽消耗。
自查方法:
- 手动访问
https://mirrors.aliyun.com/composer/p/→ 应返回 403 或 404,不是 HTML 列表 - 检查你用的镜像文档是否注明“支持 HTTP/2”和“禁用 autoindex”——华为云镜像曾因 Nginx 配置疏漏短暂暴露过
/dists/目录,后已修复 - CI 环境中避免用
curl -s https://your-mirror.com/ | head -20类命令探测,改用curl -I -s https://your-mirror.com/packages.json | grep HTTP
Directory Listing 不是 Composer 的设计行为,也不是镜像优化目标;它只是配置失当或外部误用留下的噪音。盯住 composer install -vvv 的真实请求路径,比盯着服务器日志里的“可疑 GET”更有价值。










