换国内镜像源并启用本地缓存,配合--prefer-dist --no-dev --optimize-autoloader --no-interaction参数,可使composer create-project laravel/laravel秒级完成vendor安装。卡顿主因是默认直连packagist.org导致元数据请求失败重试,叠加80+依赖包耗时飙升;需验证composer config -g repo.packagist和cache-files-dir输出均非空且正确,二者缺一不可。

直接换国内镜像源 + 启用本地缓存 + 加上 --prefer-dist --no-dev --optimize-autoloader --no-interaction 四个参数,composer create-project laravel/laravel 从卡住变秒出 vendor/ 是常态,不是玄学。
为什么 create-project 卡在 “Installing dependencies” 就不动了?
这行日志背后不是在解压,而是在反复请求 Packagist 的元数据索引,比如 packages.json、provider-laravel~11.0.json。默认直连 packagist.org,DNS 解析慢、TLS 握手失败、CDN 节点远,国内成功率常低于 40%。哪怕只卡住一次 provider 请求,整个流程就会重试 3–5 轮;叠加 Laravel 默认依赖的 80+ 个包,耗时自然飙升。
常见错误现象包括:
-
Could not fetch packages.json或Connection timed out - 同一台机器第二次运行仍要 5 分钟以上
-
-vvv日志里大量GET https://repo.packagist.org/请求
如何确认镜像真的生效了?
别信“我执行过了”,只看 composer config -g repo.packagist 的输出:
- ✅ 正确输出是完整 JSON:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - ❌ 输出为空、
null、https://packagist.org或报错,说明配置失败
常见失败原因:
- 权限不足(尤其 root 用户下)
- Composer 版本低于 2.0
- 手误写成
composer config -g repos.packagist(多一个s) - URL 缺少末尾
/,或没写https://
验证时加 -vvv 可看到真实请求地址,比如 GET https://mirrors.aliyun.com/composer/packages.json 才算走镜像。
create-project 必须带的四个关键参数
Laravel 初始化本质是一次完整的 composer install,所以生产级优化参数同样适用:
-
--prefer-dist:强制走 ZIP 包下载,跳过git clone和submodule同步(实测快 2–5 倍) -
--no-dev:Laravel 新项目初始化阶段完全不需要phpunit、laravel/pint等开发依赖 -
--optimize-autoloader:生成静态类映射,减少后续 autoload 阶段文件扫描 -
--no-interaction:避免交互式提示阻塞自动化流程
完整命令示例:composer create-project laravel/laravel demo --prefer-dist --no-dev --optimize-autoloader --no-interaction
缓存路径必须手动配对启用
只改镜像源不配缓存,速度提升有限;只开缓存不换源,缓存根本拉不到包。二者缺一不可。
执行以下三步,确保全局生效:
-
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(注意末尾斜杠不能少) -
composer config -g cache-files-dir ~/.composer/cache/files(若composer config -g cache-files-dir输出为空,说明缓存未启用) -
composer config -g cache-files-ttl 3600(防因包更新导致旧缓存误用)
Docker 或 CI 环境中,缓存挂载不能只靠 ~/.composer/cache:必须同时缓存 ~/.composer/cache 和 vendor/,并保证 composer.lock 和 PHP 版本严格一致,否则缓存失效。
最容易被忽略的是缓存路径是否真正可写、是否与镜像源配对生效——很多人的“镜像已配”只是心理安慰,composer config -g repo.packagist 和 composer config -g cache-files-dir 两条命令的输出必须都非空且符合预期,才真正跑得起来。











