“非法归档”根本原因是下载的ZIP文件损坏或镜像返回非ZIP响应,而非Composer自身错误;需用curl手动下载并unzip -t验证文件完整性,同时检查ZipArchive扩展、镜像Content-Type及系统unzip版本。

“非法归档”不是 Composer 本身出错,而是它调用的解压工具(unzip、7z 或 PHP 的 ZipArchive)无法识别下载下来的压缩包——大概率是文件损坏、HTTP 截断或镜像同步延迟导致的。
报错里带 “corrupted archive” 或 “invalid archive” 怎么确认真因
这类错误通常出现在 composer install 下载完 zip 包后尝试解压时。但 Composer 不会告诉你具体哪个包坏了,只抛出笼统异常。关键要区分是下载失败,还是解压器不兼容:
- 运行
composer install -vvv 2>&1 | grep -A 5 "Downloading",找到最后一行Downloading对应的 URL(比如https://mirrors.aliyun.com/composer/dist/monolog/monolog/monolog-3.5.0.zip) - 手动
curl -L -o test.zip <那个URL>下载下来,再执行unzip -t test.zip—— 如果报错一致,说明包本身损坏;如果能过,问题在 Composer 内部解压逻辑或缓存残留 - 检查
php -m | grep zip是否有zip扩展;没有就装:Ubuntu 上sudo apt install php-zip,CentOS 上yum install php-pecl-zip
为什么换镜像后还报非法归档
阿里云/腾讯云镜像偶尔存在同步延迟或 CDN 缓存脏数据,导致返回一个不完整或 HTML 格式的响应(比如人机验证页),却被 Composer 当作 zip 包保存。这不是你本地环境的问题:
- 先验证镜像是否返回真实 zip:
curl -I https://mirrors.aliyun.com/composer/dist/monolog/monolog/monolog-3.5.0.zip,看Content-Type是否为application/zip;如果是text/html,说明镜像返回了拦截页 - 临时切回官方源测试:
composer config -g repo.packagist composer https://packagist.org,再composer clear-cache,重试安装——若成功,基本锁定是镜像质量问题 - 某些镜像(如旧版 phpcomposer.com)已停用,URL 还在配置里就会返回 404 HTML,被误当成 zip 解压,务必删掉:
composer config -g --unset repo.packagist
PHP 的 ZipArchive 和系统 unzip 行为差异
Composer 默认优先用 PHP 的 ZipArchive 类解压, fallback 到系统 unzip 命令。两者对损坏包的容忍度不同,容易造成行为不一致:
- 强制走系统命令:
COMPOSER_DISABLE_ZIP=1 composer install,避免 PHP 的ZipArchive因 BOM 头或非标准 zip 格式报错 - 检查系统
unzip版本:unzip -v,低于 6.0 的版本可能无法处理 ZIP64 扩展(现代包常用),升级:sudo apt install unzip(Ubuntu)或brew install unzip(macOS) - Windows 用户注意:PowerShell 的
Expand-Archive不支持 zip 中的 symlink,Composer 会自动降级到7z;确保7z在 PATH 里,且版本 ≥ 19.00
真正麻烦的不是“解不开”,而是“解不开却不知道是哪一层坏的”——网络截断、镜像脏缓存、PHP 扩展缺失、系统工具老旧,四者混在一起时,必须用 curl -o + unzip -t 逐层剥离,否则永远在猜。


















