卡住停在哪一行就查哪一层:Loading composer repositories→DNS/TLS问题;Resolving dependencies→域名解析失败;Downloading→调http.timeout;Executing command→调process-timeout;Generating autoload files→权限或文件系统问题。

卡住不是随机发生的,而是明确停在某个环节——停在哪一行,就该查哪一层。盲目调高 process-timeout 只会让失败来得更晚,而不是更少。
看最后一行输出,判断卡在哪个阶段
运行 composer install -vvv 或 composer update -vvv,紧盯终端最后几行:
- 停在
Loading composer repositories:DNS 解析失败或 TLS 握手卡死,跟超时参数无关;先试curl -I https://packagist.org/packages.json,再强制 IPv4(CURL_IPRESOLVE=4 composer install)或换 DNS(nameserver 8.8.8.8) - 停在
Resolving dependencies:大概率是 packagist.org 域名无法解析,不是下载慢,调http.timeout没用 - 停在
Downloading https://...:HTTP 层卡住,重点调http.timeout(建议 300~600) - 停在
Executing command (CWD: ...):子进程(如git clone、unzip)卡死,process-timeout才管用(建议 1200) - 停在
Generating autoload files后无响应:不是网络问题,是文件系统权限、WSL2 symlink 解析慢或 APCu 未启用 CLI 模式
镜像配置写错三处,等于没配
很多人执行了 composer config -g repo.packagist https://mirrors.aliyun.com/composer/ 就以为搞定了,结果日志里还是出现 packagist.org。原因几乎全是这三处写错:
- 键名必须是
repo.packagist(单数,不是repos.packagist或repositories.packagist) - 中间必须显式声明
composer类型:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 必须以
/结尾,否则拼成/composerpackages.json直接 404
配完立刻验证:composer config -g repo.packagist 输出必须是 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},否则静默失效。
process-timeout 和 http.timeout 别混用
这两个参数作用完全不同,混着调等于蒙眼改参数:
-
http.timeout:控制每次 HTTP 请求(含 DNS 查询、TLS 握手、首字节等待、body 传输)最大秒数,默认仅 60 秒;下载大包或镜像首字节延迟高时最先触发失败;设为 300~600 最有效 -
process-timeout:控制整个命令从开始到结束的总耗时上限,默认 300 秒;它包含解压、运行post-install-cmd、生成 autoloader 等所有步骤;大项目跑脚本时容易超,推荐设为 1200(20 分钟) -
http-basic-timeout是 Composer 2.2+ 新增项,和http.timeout不同,专控 Basic Auth 场景下的请求时限;旧版本不识别,设了也白设
CI 环境下更推荐用环境变量:COMPOSER_PROCESS_TIMEOUT=1200 比 --timeout=1200 更可靠,能覆盖插件启动的子进程。
权限污染比超时更隐蔽
如果报错路径里带 vendor/、composer.lock 或 ~/.composer/cache/,且错误信息是 Permission denied 或 file_put_contents failed,大概率是目录被 sudo composer install 污染过,属主变成 root。
- 查归属:
ls -ld vendor/,若第一列含root root,就是它 - 修项目内目录:
sudo chown -R $USER:$USER vendor/ composer.lock - 修全局缓存:
sudo chown -R $USER:$USER $(composer config --global cache-dir) - Docker 中注意 UID 匹配:宿主机 UID 是 1000,容器却以 UID 0 运行 → 启动时加
user:1000,或修复时用数字 UID:sudo chown -R 1000:1000 vendor/
最易被忽略的是嵌套污染:一次 sudo composer install 可能让 vendor/ 下混进个别 root 所有子目录,ls -la vendor/ 才能发现;这种情况下 chown -R 仍有效,但若已破坏 autoload 结构,删掉 vendor/ 重来反而更快。


















