如何清理Composer缓存以释放磁盘空间?

13次阅读

能,但只清理 ~/.composer/cache/ 下的已下载包、元数据和 ZIP 归档,不涉及 vendor/、composer.lock 或项目级缓存;实际路径需通过 composer config –global cache-dir 或 ComposerConfig::getCacheDir() 确认。

如何清理Composer缓存以释放磁盘空间?

composer clear-cache 命令是否真能删掉所有缓存?

能,但只清理 ~/.composer/cache/ 下的已下载包、元数据和 ZIP 归档。它不会碰 vendor/composer.lock 或项目级缓存(如 symfonyvar/cache/)。如果你刚执行过 composer installupdate,缓存目录可能占几百 MB 甚至上 GB。

执行前建议先确认缓存大小:

du -sh ~/.composer/cache

常见误操作是反复运行 composer clear-cache 却发现磁盘没释放——大概率因为缓存路径被自定义过,或你正在清理的是某个项目的本地缓存而非全局。

如何确认 Composer 实际使用的缓存路径?

Composer 不一定用默认的 ~/.composer/cache。它会按顺序检查环境变量和配置项,优先级从高到低:

  • COMPOSER_CACHE_DIR 环境变量
  • cache-dir 配置项(可通过 composer config --global cache-dir 查看)
  • 默认路径 ~/.composer/cachelinux/macOS)或 %appDATA%ComposerCachewindows

最稳妥的方式是直接查当前生效路径:

composer config --global cache-dir

如果输出为空,再运行:

php -r "echo ComposerConfig::getCacheDir();"

注意:后者需确保 composer.phar 或 Composer 可执行文件在 include_path 中,否则报错。推荐优先用 config --global 方式。

清理后为什么某些包安装反而变慢?

因为缓存不只是“下载过的 ZIP”,还包含解析后的 packages.json、压缩包哈希、依赖图快照等。清空后首次 composer update 会重新下载并重建全部元数据,网络 + 解压耗时明显增加。

这不是 bug,是设计使然。如果你频繁切换分支或测试不同版本,可以考虑保留部分缓存:

  • 只删 ZIP 缓存:rm -rf ~/.composer/cache/files
  • 只删元数据缓存:rm -rf ~/.composer/cache/repo
  • 保留 cache-dir 下的 http 子目录(用于 HTTP 304 缓存协商)

不过手动删子目录有风险:若 Composer 正在写入,可能损坏缓存结构。稳妥做法仍是用 composer clear-cache,再配合 --no-cache 临时跳过缓存(仅调试用)。

Windows 用户容易忽略的权限问题

在 Windows 上,composer clear-cache 有时提示 “Permission denied” 或静默失败,原因通常是:

  • 缓存目录被杀毒软件或 Windows Search 索引进程占用
  • PowerShell 或 CMD 没以管理员身份运行(虽不必须,但某些组策略会拦截)
  • 路径含中文或特殊字符,导致 PHP 的 rmdir() 调用失败

解决方法不是提权,而是绕过:

composer config --global cache-dir "C:/temp/composer-cache"

然后删掉旧路径,再运行 clear-cache。新路径选纯英文、无空格、非系统盘路径更稳。

缓存路径一旦改过,记得同步更新 COMPOSER_CACHE_DIR 环境变量,否则 CI/CD 脚本可能仍往旧位置写。

text=ZqhQzanResources