“failed to extract vendor/package: unable to open archive”是zip包损坏所致,需先执行composer clear-cache清缓存、再删vendor目录、确认镜像url末尾含斜杠且生效、最后运行composer install --no-cache --force-checksums强制校验。

Failed to extract vendor/package: unable to open archive 是 ZIP 损坏,不是 PHP 缺 zip 扩展
这个错误和 PHP 的 zip 扩展无关,是 Composer 已缓存了一个损坏的 ZIP 文件,解压时直接失败。常见于网络中断、镜像源返回不完整响应,或磁盘写入异常——它不会自动重试或跳过,而是卡死在那个包上。
关键动作顺序不能错:
- 先运行
composer clear-cache,清掉~/.composer/cache/files/下所有 ZIP - 再删
vendor/(Linux/macOS 用rm -rf vendor,Windows 用rmdir /s vendor) - 确认镜像配置生效:
composer config -g repo.packagist输出必须是{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},且 URL 末尾有/ - 最后执行
composer install --no-cache --force-checksums,跳过缓存 + 强制校验双保险
为什么换阿里云/腾讯云镜像后仍报损坏?因为没验证是否真生效
很多人执行了 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 就以为搞定了,但实际可能完全没生效。原因包括:
- 项目根目录
composer.json里写了"repositories"字段,会彻底忽略全局配置 - URL 少了末尾斜杠,拼成
https://mirrors.aliyun.com/composer/packages.json→ 404 - CI 环境(如 GitHub Actions)没在 workflow 中显式运行配置命令
验证方式只有两个:composer config -g repo.packagist 看输出,或 composer diagnose 看末尾提示是否显示 “overriden by custom repo”。
Invalid argument supplied for foreach() 是 installed.json 截断,别手修
这个错误几乎总是因为 vendor/composer/installed.json 被写到一半就中断,JSON 结构断裂。Composer 启动时读它遍历已装包,空或残缺内容直接崩。
正确做法很直接:
- 删掉它:
rm -f vendor/composer/installed.json - 再跑
composer install --no-plugins,让 Composer 重建该文件 - 如果删完还报错,说明
vendor/里已有部分包目录残留但不完整(比如只有src/没有composer.json),此时必须清空整个vendor/
注意:composer validate 只验 composer.lock,对 installed.json 完全无效。
--force-checksums 不是可选参数,是必须显式加上的安全开关
Composer 2.2+ 默认只做 SHA256 校验,且容错太宽:遇到 Content-Length mismatch 或 Invalid archive signature 只打印 Warning,然后继续解压损坏包,导致后续 Class not found 或空文件。
--force-checksums 的作用是强制在校验失败时立刻退出,而不是污染 vendor/。它不依赖镜像是否“支持 MD5”——Composer 从不用 MD5,只认 dist.sha256 字段。
必须每次显式带上:composer install --no-cache --force-checksums,它不会写入配置,也不会被缓存绕过。
最容易被忽略的是:已缓存的损坏 ZIP 不会被自动跳过,所以 --no-cache 和 --force-checksums 必须同时出现,缺一不可。











