执行 composer config -g repo.packagist 输出必须是完整 json 对象,如 {"type": "composer", "url": "https://mirrors.huaweicloud.com/repository/php/composer/"};空、null、纯 url 或报错均表示未生效,常见原因包括字段名错为 repos.packagist、url 缺尾部 /、root 配置但 www 用户运行、http 协议被拒、项目级 repositories 覆盖全局配置等。

确认 repo.packagist 配置是否真正生效
执行 composer config -g repo.packagist 后,输出必须是完整 JSON 对象,形如 {"type": "composer", "url": "https://mirrors.huaweicloud.com/repository/php/composer/"}。空、null、纯 URL 字符串或报错,都说明没写对。
常见失效原因:
-
repo.packagist写成repos.packagist(多一个s)→ 命令不报错,但字段存到无效位置 - URL 缺少末尾
/→ 请求packages.json时 404,Composer 自动静默 fallback 到packagist.org - 用
root用户配置,但 CI 或宝塔以www用户运行 → 它读的是/home/www/.composer/config.json,根本看不到你的配置 - 用了
http://协议 → Composer 2.0+ 主动拦截,直接拒绝连接
项目级 repositories 覆盖全局配置怎么办
只要当前目录下 composer.json 有 repositories 字段,全局镜像就自动失效。哪怕它是空对象 "repositories": {},也会屏蔽掉 repo.packagist。
安全写法(推荐直接命令行操作,避免手写 JSON 出错):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 进项目根目录,运行
composer config repo.packagist composer https://mirrors.huaweicloud.com/repository/php/composer/(注意不加-g) - 该命令会智能处理:若原
repositories是对象{},就追加packagist条目;若是数组[],会报错,需先手动改成对象再重试 - 务必保留
"packagist.org": false在根节点,不是放在repositories里 -
"packagist"是固定 key 名,不能改成"huawei"或其他名字
http-max-concurrent-downloads 必须设,parallel-downloads 已废弃
镜像只加速下载,但默认并发数仍是 3 —— 相当于把千兆带宽压成单车道。不开高并发,换再快的镜像也跑不满。
新版 Composer(2.2+)只认 http-max-concurrent-downloads,设为 8 或 10 即可:
- 执行
composer config -g http-max-concurrent-downloads 8 -
parallel-downloads是旧名,已弃用;设了也不生效,且无任何提示 - 设成 10 以上容易触发临时文件竞争,报
file_put_contents(/tmp/): failed to open stream - 该设置只对
composer install生效;composer update仍需串行解析依赖图
CI/CD 中验证镜像是否真走国内源
别信配置命令有没有执行成功,要看实际日志里下载域名是不是镜像站。CI 脚本里必须加 -vvv 和 --no-cache:
- 加
composer install -vvv 2>&1 | grep "Downloading",确认输出中出现mirrors.huaweicloud.com或mirrors.aliyun.com - 不加
--no-cache,CI 容器可能复用旧缓存(含官方源元数据),导致解析失败或回退到packagist.org - CI 环境几乎从不读全局配置,最可靠方式是提交项目级
composer.json配置,所有环境行为一致 - GitLab CI 中记得缓存
~/.composer/cache,key 建议按 PHP 版本区分,避免跨版本污染
真正卡住的地方,往往不是镜像地址本身,而是配置没落进目标用户、并发没开、或者缓存干扰了源判断——这些点漏一个,提速就归零。










