必须显式配置cache-files-dir且路径须以/files结尾,仅设cache-dir无效;COMPOSER_CACHE_DIR环境变量优先级最高,会覆盖所有config配置;验证需以composer diag输出和files目录下zip文件生成时间为准。

composer config --global cache-files-dir 必须显式设置
只配 cache-dir 不管用,Composer 下载的 zip 包实际存在 cache-files-dir 指向的路径下,且该路径必须以 /files 结尾。不设这个值,哪怕 cache-dir 正确,包文件也不会复用。
常见错误是以为改了 cache-dir 就万事大吉,结果 composer install -vvv 日志里仍反复出现 Downloading https://...,没看到 Writing into cache: .../files/2a/2a3b4c5d.zip。
- Linux/macOS/WSL:运行
composer config --global cache-files-dir /mnt/shared-cache/files(注意末尾/files) - Windows:用 CMD 执行
composer config --global cache-files-dir "D:\shared-cache\files"(PowerShell 中%APPDATA%不展开,别直接写) - 路径必须是绝对路径,不能含
~或$HOME;目录需手动创建,且当前用户有读写权限
COMPOSER_CACHE_DIR 环境变量会绕过所有 config 配置
如果你在 CI 或 Docker 里挂载了共享缓存目录,但发现 Composer 始终不读取,大概率是 COMPOSER_CACHE_DIR 被设了但值不对,或者压根没设——这个环境变量一旦存在,就会直接覆盖 cache-dir 和 cache-files-dir 的所有配置。
验证方式很简单:php -r "echo getenv('COMPOSER_CACHE_DIR');"。输出为空?那它没生效;输出一个路径?那就得确认这个路径下是否有 files/ 子目录、是否可读、里面是否有历史 zip 包。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Bash 临时生效:
COMPOSER_CACHE_DIR="/mnt/shared-cache" composer install - PowerShell 临时生效:
$env:COMPOSER_CACHE_DIR="D:\shared-cache"; composer install - 该变量值本身不带
/files后缀,Composer 会自动在其下拼接/files—— 所以你设的是父目录,不是最终存放 zip 的路径
cache-read-only true 时,/files 目录必须可读且非空
设了 cache-read-only 并不意味着你可以随便挂个只读目录进去。Composer 仍要打开 /files/xx/xx.zip 进行校验和解压,如果目录不可读、挂载为 :ro、或里面根本没缓存文件,它就静默放弃缓存,重新下载。
典型报错现象不是明确报错,而是 composer diag 显示 Cache hit rate: 0%,且日志里全是 Downloading。
- 必须先运行一次完整
composer install把缓存填满,再启用cache-read-only - Docker 挂载时避免
:ro,改用:rw,delegated(Mac)或:rw,z(Podman/RHEL) - 检查属主:
ls -ld /mnt/shared-cache/files第三列必须是运行 composer 的用户(如www-data),否则连opendir()都失败
验证是否真走共享缓存,只看 composer diag 和文件时间戳
composer config --global cache-files-dir 输出正确 ≠ 缓存真在用。真正可信的只有两件事:composer diag 输出的 Cache files directory 行,以及目标 /files 目录下 zip 文件的修改时间是否随本次安装更新。
最容易被忽略的是:即使路径对、文件在、权限够,Composer 仍可能拒绝复用——因为 PHP 版本、composer.lock 的 hash、镜像源地址三者只要有一个不一致,它就会判定“缓存不兼容”,跳过读取。
- 执行
composer diag后,重点核对三行:Cache directory、Cache files directory、Cache hit rate - 进
cache-files-dir目录,用find . -name "*.zip" -type f -mmin -5(Linux/macOS)看五分钟内是否有新生成的 zip - CI 流水线中,若用了不同 PHP 版本的 runner,共享缓存基本无效——这不是路径问题,是内容校验逻辑决定的

















