国内直连 packagist.org 极不稳定,DNS 解析卡顿、TLS 握手超时、403 或连接超时频发,导致 composer install 失败率高;必须配置中文镜像(如阿里云)才能保障安装成功率与速度。

packagist.org 在国内访问极不稳定,不是“慢”,而是大概率失败——DNS 解析卡顿、TLS 握手超时、首字节延迟高,甚至直接返回 403 或 Connection timed out。配中文镜像不是可选项,是让 composer install 能跑起来的前提。
为什么直连 packagist.org 基本不可用
Composer 安装依赖分两步:先拉元数据(packages.json),再下 ZIP 包。这两步都卡在境外节点:
• 第一步(解析依赖)常卡在 Loading composer repositories,日志里反复重试 https://packagist.org/packages.json
• 第二步(下载包)可能卡在 Downloading https://api.github.com/...,尤其遇到 GitHub 限流或 CDN 路由绕行时
实测 Laravel 新项目安装:直连平均耗时 8–15 分钟,成功率仅 70%;切阿里云镜像后稳定在 1–3 分钟,成功率 99%
composer config -g repo.packagist 必须写对三处,否则静默失效
这条命令不报错,但写错任意一处就等于没配:
• 键名必须是 repo.packagist(不是 repos.packagist、mirror 或 packagist.org)
• 中间必须显式传 composer 作为 type 值(漏掉会 fallback 到官方源)
• URL 必须是 HTTPS + 末尾带 /(https://mirrors.aliyun.com/composer/ ✅,少斜杠会拼出 404 路径)
验证方式:运行 composer config -g repo.packagist,输出必须是完整 URL 字符串或 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},空、null 或仍显示 https://packagist.org 都说明没生效
项目级配置比全局更可靠,尤其团队和 CI 场景
全局配置(-g)只改 ~/.composer/config.json,但很多环境根本读不到它:
• 宝塔后台以 www 用户运行,你用 root 配的配置它看不见
• CI 流水线常用 runner 用户,sudo composer config -g 写进了 root 的配置,实际构建时还是走默认源
• Docker 多阶段构建中,composer 容器配了镜像,但最终 PHP 容器里没同步配置
项目级配置绕过这些坑:
• 进项目根目录,运行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/(去掉 -g)
• 它会安全写入 composer.json 的 repositories 字段,且只加 "packagist" 子项,不覆盖已有私有源
• composer.json 可提交 Git,新人拉代码后行为一致
注意:如果项目已有 "repositories": [](数组),命令会失败;需先手动改成 "repositories": {}(对象)
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
换镜像后还卡?别只盯着源,先清缓存和关 xdebug
镜像只加速远程请求,不解决本地瓶颈:
• 缓存里存着旧的 packages.json 和 provider 元数据,Composer 会优先读缓存再校验远程地址——哪怕你已切镜像,它仍可能反复尝试从 https://packagist.org 拉索引
执行 composer clear-cache(不是 composer cache-clear,后者已废弃)
• xdebug 在 autoload 初始化阶段拖慢 3–5 秒,尤其 Laravel/ThinkPHP 这类框架
临时禁用:注释 php.ini 中 xdebug 相关行,重启 PHP CLI 或 Web 服务
验证:运行 php -m | grep xdebug,无输出即生效
• 如果卡在 Resolving dependencies,和镜像无关——检查 composer.json 是否写了太宽的 PHP 版本约束(如 "php": "^7.4 || ^8.0")或塞了太多未锁定的 dev 包
立即学习“PHP免费学习笔记(深入)”;
真正容易被忽略的是:项目级repositories 字段优先级永远高于全局配置,哪怕你 composer config -g 配得再准,只要 composer.json 里有 "repositories" 块,它就起作用——包括里面写了 "packagist.org": false 这种彻底关源的语句。排查时,务必同时运行 composer config -g repo.packagist 和 composer config repo.packagist(无 -g)对比输出。


















