卡在 composer install 不动,90% 是镜像未生效、缓存未清或未走国内源;需先运行 composer install -vvv 查看最后一行停在哪一阶段,再针对性操作:loading repositories 阶段检查 config -g repo.packagist 输出是否为含 type 和正确末尾斜杠的 json,且 curl -i 验证镜像 url 返回 200;resolving dependencies 阶段与网络无关,应优化约束、增大内存;downloading 阶段须确认日志中出现国内镜像域名而非 packagist.org;并注意 clear-cache、项目级 repositories 覆盖全局、用户权限错配等常见陷阱。

卡在 composer install 不动,90% 不是网络慢,而是镜像没生效、缓存没清、或根本没走国内源——先别删 vendor,看 -vvv 输出最后一行停在哪,再对症操作。
卡在 Loading composer repositories 怎么办
这是最常见卡点,本质是 DNS 解析失败或 TLS 握手超时,直连 packagist.org 被阻断所致。
- 运行
composer config -g repo.packagist,输出必须是完整 JSON,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};返回null、空值或https://packagist.org都说明配置失败 - 确认 URL 末尾有斜杠:
https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(少斜杠会拼出/composerpackages.json导致 404) - 执行
composer clear-cache—— 否则 Composer 仍会读本地缓存的海外元数据,根本不发新请求 - 手动验证镜像连通性:
curl -I https://mirrors.aliyun.com/composer/packages.json必须返回200 OK;若返回301或超时,说明地址写错或被防火墙拦截
卡在 Resolving dependencies 怎么办
这一步完全不走网络,PHP 正在本地暴力回溯满足所有约束的版本组合,和镜像无关。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 检查
composer.json是否写了宽泛约束,比如"^1.0 || ^2.0"、"*"或"dev-main" - 默认内存限制(1.5GB)常不够,尤其含大量
require-dev包时,临时加大:php -d memory_limit=-1 composer install -
http.timeout对这一步完全无效,调它等于白忙 - Composer 2.9.6 的 SAT 求解器虽有优化,但约束爆炸仍会卡住,可先缩小
require范围再逐步放开
卡在 Downloading 后无响应怎么验证镜像真生效了
别只信 config -g 输出,要亲手验证请求是否发到国内地址。
- 运行
composer install -vvv,盯住第一行日志:必须出现Downloading https://mirrors.aliyun.com/composer/packages.json - 如果还看到
packagist.org/packages.json,说明 fallback 到了官方源,镜像没生效 - 项目根目录若存在
composer.json里的repositories字段,会直接覆盖全局配置——哪怕只写了一行"repositories": [],也得删掉或显式设"packagist.org": false - 腾讯云当前推荐地址是
https://packagist.proxy.tencent.com/,不是mirrors.cloud.tencent.com子域(后者已不维护)
卡在 Executing command 怎么办
这时 Composer 正调用 git clone、unzip 等外部命令,子进程没返回,process-timeout 才管用。
-
http.timeout完全无效,必须设process-timeout:composer config -g process-timeout 1800 - CI 环境中 exit code 137 是 OOM killer 杀掉进程的信号,需检查容器内存是否足够
- Windows 下杀毒软件可能扫描 ZIP 文件导致假死,可临时禁用或加
--prefer-dist跳过解压 - 某些包硬编码 GitHub URL(如
"dist": {"url": "https://github.com/xxx/yyy/archive/"}),这类不会走镜像,会撞上 GitHub Rate Limit;报错含GithubRateLimit就是这个原因
真正容易被忽略的是:换源后不执行 composer clear-cache,旧缓存仍会尝试访问 packagist.org;项目级 composer.json 中的 repositories 字段会静默覆盖全局配置;还有宝塔或 CI 以 www 用户运行,但 composer config -g 写的是 root 配置,www 根本读不到。










