停在Resolving dependencies是DNS解析失败,与timeout无关;停在Downloading才调http.timeout;停在Executing command才调process-timeout;必须依-vvv末行精准定位,参数作用域互不重叠。

composer install -vvv 最后一行停在哪,就说明 timeout 卡在哪一层
Composer 的 http.timeout 和 process-timeout 完全不重叠,混着调等于乱按开关。必须先看 -vvv 输出的最后一行,才能知道该动哪个参数:
- 停在
Resolving dependencies:DNS 解析失败,跟 timeout 无关;换 DNS(如114.114.114.114)或检查/etc/hosts - 停在
Downloading https://mirrors.aliyun.com/composer/packages.json:HTTP 层卡住,http.timeout才生效 - 停在
Executing command (git clone ...):子进程超时,process-timeout或环境变量COMPOSER_PROCESS_TIMEOUT才管用 - 停在
Generating autoload files后无响应:不是网络问题,是 PHP 配置(如memory_limit不足、APCu 未启用 CLI 模式)或文件系统慢(如 WSL2 symlink)
全局配置 vs 项目配置,谁会覆盖谁
Composer 加载配置有明确优先级:项目级 composer.json 的 config 字段 > 全局 composer config -g 设置 > 默认值。常见冲突来源包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目
composer.json中写了"repositories"字段,会直接屏蔽全局镜像源配置 - 全局执行了
composer config -g repo.packagist composer https://mirrors.huaweicloud.com/composer/,但 URL 末尾漏了/,导致拼出//packages.json报 404 - CI 环境中未显式设置
COMPOSER_HOME,容器重启后全局配置丢失,退回到默认 timeout - 某些插件(如
hirak/prestissimo)已废弃但仍残留,会干扰并发下载逻辑,使 timeout 行为异常
curl error 28 是表象,真正要查的是它前面那行 URL
curl error 28 只说明“等不及”,但等的是哪条链路?关键看 -vvv 输出中紧挨着它的那一行 Downloading 或 Executing 日志:
- 若 URL 是
https://api.github.com/:不是http.timeout能解决的,大概率是 GitHub token 缺失、rate limit 耗尽,或企业网屏蔽了 API 域名 - 若 URL 是私有 GitLab 地址(如
https://git.example.com/...):镜像源完全不代理 VCS 请求,此时调高http.timeout有用,但更应检查 TLS 证书是否被中间人拦截(尤其开启 HTTPS 扫描的杀软) - 若 URL 是
https://packagist.org/(而非镜像):说明全局镜像配置未生效,或项目repositories中设了{"packagist": false}但没配替代源
为什么改了 timeout 还是超时?三个容易被忽略的硬伤
timeout 参数本身没问题,但以下情况会让设置彻底失效:
-
php.ini中max_execution_time设为 30 秒,PHP 进程先于 Composer 超时退出,此时process-timeout根本没机会触发 - WSL2 下
vendor/目录挂载在 Windows 文件系统上,Generating autoload files阶段大量stat()调用极慢,表现为“卡住”,实则是 I/O 瓶颈,非 timeout 问题 - 使用了自定义
composer.jsonschema 插件,其PluginInterface::activate()方法里做了阻塞操作(如远程 HTTP 调用),这个过程不受任何 Composer timeout 控制

















