composer缓存生效需同时满足三要素:正确配置cache-dir为绝对路径、使用--prefer-dist和--no-dev参数、镜像源设为repo.packagist且url以/结尾;apcu仅在install阶段配合--optimize-autoloader启用。

确认缓存目录是否真正生效
很多人设了 cache-dir 却没提速,是因为 Composer 缓存是分层的,只有 files/ 子目录下的 ZIP 包(如 monolog/monolog/2.10.0.0/monolog-monolog-6a8c4b5.zip)才能被 --prefer-dist 直接复用。其他路径(repo/、vcs/)断网即失效。
检查当前配置:composer config -g cache-dir 输出应为绝对路径;若为空或指向错误位置,需重设:
composer config -g cache-dir "$HOME/.composer/cache"
常见坑点:
-
cache-dir被设为相对路径(如./cache),导致不同项目写入不同位置 - 用户权限不足,Composer 写入失败但不报错,缓存实际未落盘
- Docker 或 CI 环境中未挂载缓存目录,每次构建都是“裸跑”
必须搭配 --prefer-dist 和 --no-dev 才能命中缓存
缓存 ZIP 包只在 --prefer-dist 模式下被读取;如果用了 --prefer-source(默认 fallback 行为),Composer 会直接克隆 Git 仓库,完全绕过缓存。
生产环境更新务必加这两个参数:
composer update --prefer-dist --no-dev
原因很实在:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--prefer-dist强制走 ZIP 下载路径,触发缓存文件复用逻辑 -
--no-dev减少约 30–60% 的依赖解析量,尤其跳过 PHPUnit、PHPStan 等重型 dev 包 - 漏掉任一参数,缓存利用率可能直接归零
镜像源配错 = 缓存白配
即使缓存目录正确、参数齐全,只要镜像没生效,Composer 仍会静默回退到 packagist.org 或直连 codeload.github.com,导致所有缓存无法命中。
三要素缺一不可:
- 键名必须是
repo.packagist(单数,不是repos.packagist) - 第二参数必须显式写
composer:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 必须以
/结尾:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(拼出/composerpackages.json导致 404)
验证方式:composer config -g repo.packagist 输出必须是完整 JSON 对象,且含 "type": "composer";再跑一次 composer clear-cache,否则旧元数据还在内存里。
APCu 缓存对 update 本身无加速,但影响后续 install
--apcu-autoloader 不加快 update 过程,它只在生成 autoload 映射时起作用,且必须和 --optimize-autoloader 同时使用——因为 APCu 缓存的是 autoload_classmap.php 里的完整类路径映射,没这个文件就缓存不了。
所以真正的提速链路是:
- 先
composer update --prefer-dist --no-dev --optimize-autoloader - 再
composer install --apcu-autoloader --no-dev(此时才启用 APCu) - 部署后记得清 APCu:
php -r "apcu_clear_cache('user');",否则旧映射残留会导致类找不到
最易忽略的点:APCu 缓存生命周期与部署动作脱节。缓存写进去了,但没人告诉它该什么时候失效——这不在 Composer 命令里,而在你的发布脚本里。










