答案是Composer默认复用15分钟内未过期的本地packages.json缓存,导致即使镜像站已更新新版本,update仍按旧元数据计算而忽略新版本;解决方法为≥2.5版本执行composer update --refresh强制刷新元数据,老版本需手动删缓存目录或设COMPOSER_CACHE_DIR=/dev/null。

不是 Packagist 宕了,而是你本地没拿到最新元数据——Composer 默认复用缓存的 packages.json,哪怕镜像站上已更新,它也视而不见。
composer update 为什么装不到新版本?
根本原因在于 Composer 不会每次执行都去拉远程元数据,它只检查缓存目录下对应镜像源的 packages.json(比如 ~/.composer/cache/repo/https---mirrors.aliyun.com-composer/)。只要该文件存在且未超时(默认 15 分钟),就直接读缓存,跳过网络请求。
- 现象:Packagist 页面显示
monolog/monolog已发布 3.6.0,但composer update monolog/monolog却提示 “Nothing to install or update” - 本质:缓存里仍是旧版
packages.json,里面根本没有 3.6.0 的记录 -
composer clear-cache会清掉这个文件,但下次update运行时又立刻重建并复用——除非你强制打断这个逻辑
如何强制刷新元数据(≥ Composer 2.5)?
composer update --refresh 是专为同步延迟设计的开关:它强制丢弃所有已缓存的 packages.json,重新从当前配置的镜像源下载最新元数据,但不碰 ZIP 包缓存。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它不会重下任何包,只刷新“有哪些版本可用”这个信息
- 执行后立刻再跑
composer update vendor/package-name,就能识别出新版本 - 确保
composer config -g repo.packagist输出的是你期望的 HTTPS 地址(如https://mirrors.aliyun.com/composer/),否则--refresh会去错地方拉 - Composer 2.4 及更早版本不支持该参数;老版本只能手动删缓存目录里的
repo/子目录,或临时用COMPOSER_CACHE_DIR=/dev/null composer update
怎么验证 Packagist 真连得通?别信 composer diagnose
composer diagnose 硬编码只访问 https://packagist.org,完全不读你配的镜像源、COMPOSER_REPO_PACKAGIST 环境变量,甚至忽略 composer.json 里的 repositories。它失败 ≠ 你日常装包失败;它成功 ≠ 镜像真通了。
- 验证镜像是否生效,直接跑:
composer show -p | head -5——它走当前实际配置,能拉出包列表就说明镜像通了 - 手动测试底层连通性:
curl -I https://packagist.org/packages.json,看是否返回 200 OK,而非超时或证书错误 - 某些企业镜像会静默丢弃非白名单
User-Agent(比如Composer/2.x),这时必须加头测试:curl -A "Composer/2.x" https://mirrors.aliyun.com/composer/packages.json - 若
curl报证书问题但php -r "echo file_get_contents('https://packagist.org/packages.json');"成功,说明 PHP 的 OpenSSL 配置和系统curl不一致,需统一设置COMPOSER_CAFILE
Packagist 状态不能只靠人肉刷网页
官方没有实时状态页,但你可以用 Packagist 提供的公开 API 做轻量探测:访问 https://packagist.org/packages.json 的响应头是否为 200,响应体是否含有效 JSON(如 "packages" 字段),就是最直接的状态信号。
- CI 中建议加一层健康检查脚本,比如
curl -s -o /dev/null -w "%{http_code}" https://packagist.org/packages.json | grep -q "200" - 注意:国内直连大概率超时或 TLS 握手失败,所以这个检查应放在能稳定访问外网的节点,或改用你信任的镜像地址(如清华、阿里云)做等效判断
- 同步延迟是常态——新包发布后,镜像通常有 5–30 分钟滞后,不要一查不到就以为包不存在

















