composer安装速度优化_composer提升下载效率终极方案

composer install 卡在 downloading 主因是默认连接海外 packagist.org,国内用户面临 dns 慢、建连超时、tls 握手失败及无并发控制等问题;换用清华/阿里/腾讯等支持签名验证的国内镜像源并清缓存可解决。

composer安装速度优化_composer提升下载效率终极方案

为什么 composer install 卡在 downloading 包?

不是网络抽风,大概率是默认源走的是 packagist.org 官方服务器,物理距离远、没 CDN、还常被干扰。国内用户直连时 DNS 解析慢、TCP 建连超时、TLS 握手失败都可能触发重试,看着就像“卡住”。更隐蔽的问题是:Composer 会为每个包单独发起请求,没并发控制,小包多时 IO 等待明显。

  • 换国内镜像源是最直接有效的解法,优先用清华、阿里或腾讯的镜像
  • 镜像必须支持 Composer 2.x 的 packages.json 结构和签名验证(如 <a href="https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9">https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9</a>
  • 切源前先清缓存:composer clear-cache,否则旧包仍可能从原源拉取

怎么安全切换到国内镜像源?

切源不是改个 URL 就完事,得兼顾安全性与兼容性。Composer 1.10+ 和 2.x 对镜像签名要求不同,随意配错会导致 Signature mismatch 错误。

  • 全局设置(推荐):composer config -g repo.packagist composer <a href="https://www.php.cn/link/16f26d49cfe75d6731a310494bf56f7d">https://www.php.cn/link/16f26d49cfe75d6731a310494bf56f7d</a>
  • 项目级设置(更可控):composer config repo.packagist composer <a href="https://www.php.cn/link/aad92567225d700b4408b63e7fe0f9c8">https://www.php.cn/link/aad92567225d700b4408b63e7fe0f9c8</a>
  • 不要用 composer config -g packagist.org false 这类禁用操作,会破坏私有包解析逻辑
  • 切换后运行 composer show -p 确认源地址已更新,且不报 Invalid repository type

composer install 还慢?关掉这些默认行为

镜像只是第一步。Composer 默认行为里藏着不少“减速带”:验证签名、加载插件、扫描 autoload、甚至写日志都会拖慢安装。

  • 关闭插件自动加载:composer install --no-plugins(尤其避免 hirak/prestissimo 这类过时加速插件,它在 Composer 2.x 中已失效甚至冲突)
  • 跳过 autoload 生成(如果确定不需要):composer install --no-autoloader
  • 禁用进度条和彩色输出(减少终端 IO):composer install --no-ansi --quiet
  • 不要加 --verbose-v,调试时再开,日常 CI 构建务必去掉

CI 环境下反复 install?用好 vendor 缓存和 lock 文件

在 GitHub Actions / GitLab CI 里每次从头 composer install 是最大浪费。根本问题不在网络,而在没复用已有依赖树。

  • 必须提交 composer.lock,且确保 CI 使用的 PHP 版本与本地一致(platform.php 配置会影响包版本选择)
  • CI 中优先恢复 vendor/ 缓存(如 GitHub Actions 的 actions/cache),key 建议含:composer.lock 的 hash + PHP version + Composer version
  • 如果项目含大量 dev-only 包,CI 可用 composer install --no-dev --optimize-autoloader,跳过测试相关依赖并生成静态映射

镜像源只是入口,真正影响速度的往往是 lock 文件是否稳定、vendor 是否复用、以及你有没有在不该验证的时候硬要验证。一个没被注意到的 composer.json 里写了 "minimum-stability": "dev",就足以让 Composer 放弃所有缓存,重新遍历整个分支历史。