Failed to extract 错误需精准删除损坏ZIP而非全量清缓存,先通过composer install -v定位包名,再进cache/files目录模糊搜索并删除对应ZIP;若仍失败,须同步备份并删除vendor与composer.lock,最后用composer install --no-cache --force-checksums重装。

Failed to extract 错误必须手动删 ZIP,不是清全量缓存
看到 Failed to extract vendor/symfony/console 或 Corrupted zip file: monolog/monolog,别急着跑 composer clear-cache。这类错误本质是 ~/.composer/cache/files/(Linux/macOS)或 %APPDATA%\Composer\Cache\Files(Windows)里某个 ZIP 文件损坏,Composer 拿着坏包硬解压,直接报错卡住,不会自动跳过。
正确做法是精准定位后只删那个 ZIP:
- 盯住
composer install -v输出末尾,找Extracting或Downloading后紧跟着的包名(如symfony/console) - 查缓存路径:
composer config --global cache-dir - 进
files/子目录,用包名模糊搜索:ls -l *console*.zip(Linux/macOS)或 PowerShell 中Get-ChildItem "$env:APPDATA\Composer\Cache\Files" -Recurse -Filter "*console*.zip" - 只删匹配的 ZIP;别碰
repo/和vcs/—— 它们不参与解压
删 ZIP 后还失败?vendor 和 composer.lock 必须同步清理
只删 ZIP 不够。Composer 会校验 composer.lock 里硬编码的 dist.sha256 值,和当前缓存 ZIP 不匹配就拒绝安装。漏掉 composer.lock 就白删 vendor/,尤其 CI 环境中,它若含旧源地址,重装永远走错路。
必须三步同步操作:
- 备份:
cp composer.lock composer.lock.bak(Linux/macOS)或copy composer.lock composer.lock.bak(Windows) - 删干净:
rm -rf vendor composer.lock或rd /s /q vendor & del composer.lock - 重装加参数:
composer install --no-cache --force-checksums——--no-cache跳过本地 ZIP,--force-checksums让校验失败立刻退出,不污染vendor/
磁盘空间不足导致解压失败,TMPDIR 才是关键
composer clear-cache 只清 ~/.composer/cache/,不碰系统临时目录。而 Composer 默认把 ZIP 下载、解压、重命名全放在 /tmp(Linux/macOS)或 %TEMP%(Windows)里做——这个分区往往只有几 GB,才是爆满真凶。
必须改 TMPDIR:
- Linux/macOS:
export TMPDIR="/mnt/bigdisk/tmp"; mkdir -p "$TMPDIR"; chmod 777 "$TMPDIR" - Windows:
set TMPDIR=C:\bigdisk\tmp(CMD)或$env:TMPDIR="C:\bigdisk\tmp"(PowerShell) - 验证:
echo $TMPDIR(Linux/macOS)或echo %TMPDIR%(Windows) - 别只改
COMPOSER_CACHE_DIR:不改TMPDIR,解压阶段照样撞上No space left on device
metadata 更新滞后?repo/ 目录和 installed.json 都得清
运行 composer update 拉不到新版本,常因 metadata 缓存没刷新。虽然 composer clear-cache 清了 files/ 和 vcs/,但 ~/.composer/cache/repo/https---packagist.org/ 下的 packages.json 和 provider-*.json 还在用旧快照,vendor/composer/installed.json 也锁着已安装版本。
真正要删的三处:
rm -rf ~/.composer/cache/repo/https---packagist.org/rm -f vendor/composer/installed.jsonrm -f composer.lock
之后再跑 composer update,观察日志是否出现 Downloading https://packagist.org/packages.json —— 有这行才说明 metadata 真的重拉了。











