镜像过期主因是本地配置了已下线镜像(如laravel china)或http地址,需用composer config --list | grep repo.packagist确认实际生效url为https://mirrors.aliyun.com/composer/(含末尾斜杠),并curl -i验证返回200;否则清缓存、注释项目级repositories、改用repositories.packagist.org键名重配。

镜像过期不是源挂了,而是你本地还拿着旧地址在请求已下线的 provider 文件。 Composer 本身不感知“镜像是否过期”,它只认配置里写的 URL 和缓存里存的路径——一旦镜像站停服(比如 packagist.laravel-china.org 已于 2023 年底彻底下线),或你配的是 HTTP 地址(阿里云已停用 HTTP 镜像),所有请求都会卡在 Loading composer repositories 或直接 404。
怎么确认镜像地址是不是真失效了
别猜,用命令看实际生效的源:
- 运行
composer config --list | grep repo.packagist,输出必须是类似https://mirrors.aliyun.com/composer/(注意结尾斜杠和 https) - 如果输出为空、是
http://开头、或仍是https://repo.packagist.org,说明当前没走任何有效镜像 - 临时验证:执行
curl -I https://mirrors.aliyun.com/composer/packages.json,返回HTTP/2 200才算活;若超时、301 或 SSL 报错,问题出在 DNS、代理或证书,不是 Composer 配置
切镜像后还报 404 或 connection refused 怎么办
90% 是缓存没清干净,或者项目级配置覆盖了全局设置:
- 立刻执行
composer clear-cache—— Windows 下还需手动删%LOCALAPPDATA%\Composer\cache - 检查项目根目录
composer.json是否含"repositories"字段,有就临时注释掉,避免它屏蔽全局镜像 - CI 环境特别容易踩坑:GitHub Actions 的 cache 可能固化了旧 provider 地址,必须配
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}才能随 lock 变更自动刷新 - 如果
composer install -vvv日志里仍出现GET https://packagist.org/p/...,说明配置根本没生效,重跑composer config -g repositories.packagist.org composer https://mirrors.aliyun.com/composer/(注意键名是repositories.packagist.org,repo.packagist在 Composer 2.2+ 已被静默忽略)
ThinkPHP 安装失败时该换哪个镜像地址
优先用阿里云,其次腾讯云;Laravel China 镜像已不可靠,慎用:
- 阿里云(推荐):
composer config -g repositories.packagist.org composer https://mirrors.aliyun.com/composer/ - 腾讯云:
composer config -g repositories.packagist.org composer https://mirrors.cloud.tencent.com/composer/ - 临时单次安装 TP:
composer create-project topthink/think myapp --repository=https://mirrors.aliyun.com/composer/ - 绝对不要用
http://地址,阿里云自 2025 年起已强制 HTTPS,用 http 会 301 重定向失败
最常被忽略的一点:镜像地址改对了,但 PHP 的 cURL 没法验证证书——比如系统 CA 包老旧、curl.cainfo 指向一个空文件、或 Docker 容器里时间偏差超过 5 分钟。这些都会让 Composer 卡在 TLS 握手,看起来就像镜像“连不上”。











