根本原因是默认配置下Composer反复校验、解包、生成autoload等冗余操作,叠加磁盘I/O、PHP解析开销及废弃插件影响;升级至Composer 2.2+并配置镜像、缓存、discard-changes等可显著提速。

为什么 composer install 慢得像在编译内核
根本原因不是网络,而是默认配置下 Composer 会反复做校验、解包、生成 autoload、写锁、验证签名——尤其在没开缓存或用了 dev-master 这类不稳定的版本约束时。本地磁盘 I/O 和 PHP 解析开销经常被低估。
- 每次运行都重新解析整个
composer.lock,哪怕只改了一个包 -
vendor/目录权限或文件系统(比如 WSL2 的 ext4 + Windows 混合挂载)会导致解压变慢 2–5 倍 - 启用了
apcu但没配apcu.enable_cli=1,CLI 下完全不生效
加这 4 行配置,composer install 快一半以上
不是靠换镜像源,是关掉冗余动作。直接改全局配置,一劳永逸:
composer config -g repos.packagist composer https://packagist.phpcomposer.com
composer config -g fxp-asset.installer-paths {"npm-asset-library": "assets/npm", "bower-asset-library": "assets/bower"}
composer config -g cache-dir ~/.composer/cache
composer config -g discard-changes true
-
repos.packagist换国内镜像(注意:用https://packagist.phpcomposer.com,不是已停服的https://packagist.laravel-china.org) -
discard-changes true避免每次提示 “Discard changes and run install?” —— 这个交互在 CI 或脚本里会卡住 -
cache-dir强制指定到 SSD 路径,别让它默认塞进~/.composer(可能在机械盘或加密卷上) - 删掉
fxp/composer-asset-plugin插件(如果还留着),它早已被官方废弃,且严重拖慢依赖解析
composer update 卡在 “Resolving dependencies” 怎么破
这不是网络问题,是依赖图太复杂导致 SAT 求解器爆炸。Composer 2.x 默认启用 pooling,但某些旧项目 require 写得太宽(比如 "monolog/monolog": "^1.0 || ^2.0"),会让求解时间从秒级跳到分钟级。
- 先跑
composer update --dry-run --no-plugins看是否还卡 —— 如果不卡,说明某个插件(如hirak/prestissimo)和新版 Composer 冲突 - 缩小更新范围:
composer update vendor/package-name --with-dependencies,别动全量 - 检查
composer.json里有没有"minimum-stability": "dev",有就删掉;稳定版约束能大幅减少候选版本数 - 临时禁用并行下载:
composer config -g disable-tls false(有些企业代理会干扰 TLS 握手,反而让并发变负优化)
autoload 生成慢?别碰 dump-autoload 默认参数
composer dump-autoload 默认走 --optimize(即生成 classmap),但如果你项目里大量用 PSR-4,这个优化反而让首次加载更慢——因为 classmap 文件体积大、PHP 解析耗时高,且无法按需加载。
- 开发环境用
composer dump-autoload -a(--classmap-authoritative)+opcache.preload配合才真正提速 - CI 构建用
composer install --no-dev --optimize-autoloader --classmap-authoritative,三者必须一起用,缺一不可 - 确认
vendor/autoload.php没被反复 include —— 某些框架(如旧版 Laravel)会在循环中 require 它,导致 autoloader 初始化数十次
最常被忽略的是:Composer 自身版本。低于 2.2 的版本在处理大型锁文件时有已知性能退化,composer self-update 不是可选项,是必选项。











