大型项目install/update卡在“Resolving dependencies”是因Composer依赖求解器暴力穷举组合,非镜像问题;需调高memory_limit、用--no-dev/--prefer-dist/--optimize-autoloader,并检查项目级repositories是否覆盖全局镜像及CI用户权限。

为什么大型项目 install/update 会卡在 “Resolving dependencies”
这不是镜像没生效,而是 Composer 在本地暴力穷举依赖组合——镜像只加速下载,不加速解析。尤其当 composer.json 里存在宽泛约束(如 "php": "^7.4 || ^8.0 || ^8.1 || ^8.2")、"minimum-stability": "dev" 或大量 require-dev 包时,求解器可能尝试上万种版本组合,CPU 占满、内存爆掉、卡住十几分钟甚至超时失败。
常见现象:日志停在 Resolving dependencies...,但 curl -I https://mirrors.aliyun.com/composer/packages.json 返回 200,说明网络和镜像本身没问题。
- 删掉
vendor/和composer.lock后执行composer install,仍卡住 → 解析问题,不是下载问题 -
composer update --dry-run -vvv显示大量Trying日志 → 确认是求解器瓶颈 - PHP 内存不足报错(
Allowed memory size exhausted)→ 必须调高memory_limit,否则解析直接中断
镜像配置必须配合 --prefer-dist 和 --no-dev 才有效
即使用了阿里云或腾讯云镜像,如果还走 git clone 或拉 require-dev,下载环节照样慢得离谱。大型项目里,phpunit、phpstan 这类 dev 包体积动辄 50MB+,且含大量子模块,git clone 的 I/O 和网络开销远高于 ZIP 包。
-
--prefer-dist强制走 ZIP 下载(镜像源提供 dist 包),跳过 git 操作;不加它,Composer 默认优先 clone(尤其对 GitHub 源) -
--no-dev跳过所有require-dev,省掉 30–60% 安装时间,生产环境必加 -
--optimize-autoloader(或-o)生成 classmap,减少运行时文件扫描,对 autoload 性能有实质提升 - 命令示例:
composer install --no-dev --prefer-dist --optimize-autoloader
项目级 repositories 配置容易覆盖全局镜像
很多团队把镜像写进 composer.json 的 repositories 字段,却忘了这会完全屏蔽全局配置——哪怕你已用 composer config -g repo.packagist 配好阿里云,只要项目里有 "repositories": [...],Composer 就只读这个数组,不再 fallback 到全局镜像。
- 检查是否被覆盖:进项目根目录,运行
composer config repos.packagist;如果输出空,但composer config -g repo.packagist有值,说明项目级配置生效了 - 项目级配置若含私有源,务必确保第一个仓库是公共镜像,且不要写
"packagist.org": false(这会关掉所有 packagist.org 元数据,导致基础包找不到) - 正确写法(仅追加,不覆盖):
composer config repo.packagist composer https://mirrors.aliyun.com/composer/,它会自动 merge 进repositories数组 - 手动改
composer.json时,确认repositories是数组([]),不是对象({}),否则 Composer 2.x 会报错
CI/CD 中镜像失效的真正原因常是用户权限或环境变量
GitHub Actions、GitLab CI 或宝塔部署脚本里跑 composer install 失败,90% 不是镜像地址问题,而是配置没落到实际执行用户身上,或者被环境变量干扰。
- CI runner 默认用
runner用户,composer config -g却写进了root的~/.composer/config.json→ 需在 CI 脚本开头加sudo -u runner composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 宝塔后台「一键部署」以
www用户运行,但你本地配的是root→ 查看宝塔日志里的 UID,再用sudo -u www composer config -g ...补配 - 环境变量
COMPOSER_REPO_PACKAGIST优先级高于全局配置,如果 CI 模板里设了旧镜像或空值,会静默覆盖你的config -g - 验证方式:在 CI 脚本中加一行
composer config -g repo.packagist,输出必须是你配的 URL,否则整个流程都白搭
Resolving dependencies,就别折腾 URL;如果是 Downloading 卡住,再查 DNS、HTTPS 证书或防火墙拦截。


















