composer install 慢的根本原因是默认每次从零解析依赖、下载解压zip包、生成autoload,尤其在无缓存ci环境中;应启用全局缓存、使用--prefer-dist和--no-dev、切换国内镜像源,并结合docker层缓存优化vendor复用。

Composer install 为什么慢得反常
根本原因不是 Laravel 本身,而是 composer install 默认每次都要重新解析依赖、下载 ZIP 包、解压、安装 autoload、生成 autoloader —— 尤其在无缓存的 CI 环境或新机器上,vendor/ 完全从零构建时,PHP 包数量多(Laravel 8+ 依赖超 80 个),网络 + 解压 + IO 成为瓶颈。你看到的 “卡在 Installing dependencies from lock file” 实际在干三件事:校验 hash、拉取 dist 包、写文件到磁盘。
启用 Composer 全局缓存并验证是否生效
Composer 自带本地缓存(~/.composer/cache),但默认只缓存已下载的 ZIP 包,不缓存解压后的内容;且某些 Docker 镜像或 root 用户环境可能禁用缓存。必须手动确认并加固:
- 运行
composer config -g cache-dir查看当前全局缓存路径,确保非空且可写 - 执行
composer config -g cache-files-ttl 3600把缓存有效期设为 1 小时(避免因包更新导致旧缓存误用) - 检查是否意外关闭了缓存:
composer config -g cache-files-dir若输出为空,说明缓存未启用,需补上composer config -g cache-files-dir ~/.composer/cache/files - CI 环境中务必挂载缓存目录(如 GitHub Actions 的
actions/cache,缓存路径为~/.composer/cache)
用 --prefer-dist 和 --no-dev 缩短关键路径
Laravel 开发依赖(如 phpunit/phpunit、laravel/pint)在生产部署时完全不需要,而 --prefer-dist 强制走 ZIP 下载而非 git clone,能跳过 git 初始化、checkout、submodule 同步等耗时操作。这两参数组合是生产环境安装的底线配置:
composer install --no-interaction --prefer-dist --no-dev --optimize-autoloader
注意:--optimize-autoloader 不只是“加个 flag”,它会把 PSR-4 映射转成静态数组,减少 class_exists() 时的文件扫描,对 Laravel 的服务提供者加载有明显提速(实测 autoload 加载阶段快 30%+)。
替换 packagist.org 镜像源为国内加速节点
原生 Packagist 域名解析慢、TLS 握手不稳定、CDN 节点远,直接导致 packages.json 元数据拉取失败或超时。阿里云、腾讯云、华为云都提供免费镜像,但要注意两点:
- 必须用
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(注意末尾斜杠不能少,否则 404) - 镜像同步有延迟(通常 ≤15 分钟),若你刚发布私有包或依赖某未同步的新版本,切回官方源调试:
composer config -g repo.packagist composer https://packagist.org - 不要混用多个镜像源(如同时配
repo.packagist和repositories数组),Composer 会降级为逐个尝试,反而更慢
缓存和镜像解决的是“重复下载”和“首次元数据获取”问题,但真正影响 Laravel 安装体验的,其实是 vendor 目录下那堆未压缩的 PHP 文件 —— 它们没法被 Composer 缓存,只能靠构建层复用(如 Docker layer cache)或提前预热。这点容易被忽略,但恰恰是 CI 中最该做却最少做的一步。











