Composer缓存过期由cache-ttl(元数据,默认600秒)、cache-files-ttl(ZIP包,默认6个月)和cache-vcs-ttl(Git克隆,默认900秒)三者独立控制,修改后必须配合composer clear-cache或手动清理对应缓存目录才生效。

中文镜像配置本身不改变 Composer 缓存过期逻辑,但会放大 cache-ttl / cache-files-ttl 配置错误带来的问题——比如你设了 cache-ttl 为 30 秒,却没清元数据缓存,那即使镜像源已同步新包,Composer 仍用着本地 10 分钟前的 packages.json。
为什么改了阿里云镜像还看不到新 tag?查 cache-ttl 而不是镜像地址
镜像源(如 https://mirrors.aliyun.com/composer/)只是把 Packagist 的 packages.json 同步过来,它不决定“你是否请求它”。真正起作用的是 cache-ttl:它控制 Composer 是否认为本地缓存的 packages.json 还有效。
- 默认值是
600(10 分钟),意味着即使镜像站刚同步了新 tag,你的composer update在 10 分钟内也不会去拉新文件 - 常见翻车点:你执行了
composer config -g cache-ttl 30,但没运行composer clear-cache,旧packages.json还在$COMPOSER_HOME/cache/repo/https---mirrors-aliyun-com-composer/下躺着 - 验证是否真生效:加
-v运行composer update -v,看日志里有没有Downloading https://mirrors.aliyun.com/composer/packages.json
cache-files-ttl 才是你发版后装错代码的元凶
私有包打了新 tag、CI 却还在解压上周的 ZIP?这不是镜像的问题,是 cache-files-ttl 在作祟。它管的是 ~/.composer/cache/files/ 下那些 .zip 和 .tar 文件的“保质期”,和镜像源完全无关。
- 默认值是
15552000(6 个月),所以哪怕你昨天刚 push 了 hotfix,只要本地 ZIP 没过期,composer install就直接解压旧包 - 开发中建议设为
86400(24 小时):composer config -g cache-files-ttl 86400 - 注意:
composer clear-cache不会清files/目录下的 ZIP,要立刻生效得手动删或等自然过期
私有 Git 仓库依赖不受镜像和前两者影响,只认 cache-vcs-ttl
如果你的 composer.json 里写的是 "vendor/pkg": "dev-main" 且源是 git@xxx:vendor/pkg.git,那 cache-ttl 和 cache-files-ttl 全部失效。Composer 会完整 clone 一份到 $COMPOSER_HOME/cache/vcs/,并由 cache-vcs-ttl 控制是否复用这个克隆副本。
- 默认值是
900(15 分钟),push 新 commit 后composer update仍 checkout 旧版本,大概率是它卡着 - 设为 5 分钟:
composer config -g cache-vcs-ttl 300 - 改完不会自动删旧克隆目录,要立刻生效得手动删对应子目录,或运行
composer clear-cache(它会清整个vcs/)
最常被忽略的一点:三个 TTL 配置互不干扰,且都需配合缓存清理才真正见效。光改配置不删旧文件,等于在高速路口贴了限速牌,但没拦车检查——车(缓存)照样按老规矩跑。


















