composer install卡在downloading本质是默认串行下载,并非网络差;须升级至2.2+、设parallel-downloads为10、切阿里云镜像、清缓存并关闭--no-dev等干扰项。

composer install 卡在 downloading 是并发没开,不是网差
Composer 默认是单线程下载,哪怕你带宽 1G、机器 32 核,composer install 也只开 1 个连接——这不是“慢”,是根本没并行。95% 的“卡住”现象,实际是串行排队,而非网络延迟。
- 执行
composer --version,输出必须是Composer version 2.2.x或更高;低于此版本(如2.1.14或任何1.x)压根不识别parallel-downloads,设了也白设 - 运行
composer config -g parallel-downloads,返回空表示未启用,返回3是默认值(基本等于没开) - 旧插件
hirak/prestissimo必须卸载:composer global remove hirak/prestissimo,否则会静默干扰新版调度逻辑,甚至降级为单线程
parallel-downloads 和 http-max-concurrent-downloads 到底该设哪个
Composer 2.2+ 只认 parallel-downloads,http-max-concurrent-downloads 已被弃用——设了也不起作用,还可能让你误以为配置生效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 全局设为
10是多数开发机的安全上限:composer config -g parallel-downloads 10 - 若报错
file_put_contents(/tmp/): failed to open stream,说明临时文件争抢严重,立即降到6或8 - 别设
20或更高:镜像站会限流,本地 DNS / TLS 握手也可能超时,反而触发大量重试 - 该配置仅对
composer install生效;composer update因依赖图实时计算,仍存在明显串行段
换镜像源后速度没变?大概率缓存没清或 URL 写错
并发只是“同时发请求”,如果每个请求都卡在 DNS 解析、TLS 握手或回源失败,并行毫无意义。国内直连 packagist.org 基本不可用,不是你网差,是路由绕行 + CDN 缺失 + TLS 慢握手三重卡点。
- 推荐阿里云镜像(当前最稳):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 换源后务必清缓存:
composer clear-cache,否则旧元数据仍在偷偷走packagist.org - 验证是否生效:
composer config -g repo.packagist输出必须是完整 URL,不能是null或空值 - 已停更的源(如
https://packagist.phpcomposer.com)会返回404,千万别用;清华源新地址是https://mirrors.tuna.tsinghua.edu.cn/composer/
CI/CD 中不关脚本和 autoload,快不起来
开发时需要 autoload 和脚本,但 CI 构建或生产部署时,它们全是纯开销。一个含上百包的项目,post-install-cmd 和自动生成 autoload 可吃掉 30%+ 时间。
- 固定使用:
composer install --prefer-dist --no-dev --no-scripts --no-autoloader --optimize-autoloader -
--no-autoloader跳过生成vendor/autoload.php,后续用composer dump-autoload --optimize单独补 -
--no-scripts阻止执行post-install-cmd等钩子,避免意外触发 npm 构建、Redis 清库等重型操作 -
--prefer-dist强制走 ZIP 包安装,跳过 Git 克隆开销;若项目里有"prefer-source": true,得手动删掉,否则无效










