Composer报“Unzip with unzip command failed”是ZipArchive失败后回退调用unzip也失败的双重信号;须先验证php -r "new ZipArchive();"是否报错,确认ZipArchive可用后再安装系统unzip命令。

Composer 报错 Unzip with unzip command failed, falling back to ZipArchive class 时,别急着装 unzip —— 这句话不是“已降级成功”的提示,而是“ZipArchive 失败后尝试调用系统 unzip,结果也失败了”的双重失败信号。真正要先确认的是 PHP 的 ZipArchive 类是否真能用。
为什么装了 unzip 还报错?因为 Composer 先用 ZipArchive,不用 unzip
Composer 默认根本不会碰系统 unzip 命令,它优先走 PHP 原生的 ZipArchive::extractTo()。只有当这个方法因以下任一原因失败时,才会 fallback 到调用 unzip:
-
ZipArchive类根本未加载(php -m | grep zip无输出,或php -r "var_dump(class_exists('ZipArchive'));"返回bool(false)) -
disable_functions禁用了proc_open(ZipArchive内部依赖它) -
open_basedir限制导致无法写入目标目录 - PHP 编译时没启用 zlib 支持(
php -i | grep zlib为空)
所以第一步永远是:运行 php -r "new ZipArchive();"。报错就说明问题在 PHP 扩展层,不是系统缺命令。
Linux 上安装 unzip 命令:按发行版执行对应命令,别猜包名
确认 ZipArchive 可用后,再补 unzip 作为兜底。不同发行版的包名和命令不同,直接照着系统类型执行:
- Ubuntu/Debian:
sudo apt update && sudo apt install -y unzip - CentOS/RHEL 7:
sudo yum install -y unzip - CentOS/RHEL 8+ / Fedora:
sudo dnf install -y unzip - Alpine(Docker 常见):
apk add --no-cache unzip(务必加--no-cache,否则镜像体积翻倍)
装完立刻生效,不用重启 PHP 或 Web 服务。验证:运行 unzip -v 应输出版本号;which unzip 应返回路径(如 /usr/bin/unzip)。
Windows 下让 unzip 命令可用:别折腾 PATH,直接放 System32
Windows 原生没有 unzip,CMD/PowerShell 找不到 unzip.exe 就会报“不是内部或外部命令”。最稳的方案不是改 PATH,而是把官方 unzip.exe 放进系统默认搜索路径:
- 去 Info-ZIP 官网 下载 Win32 版本的二进制包(.zip 文件)
- 解压出里面的
unzip.exe - 复制到
C:\Windows\System32(64 位系统也放这里,32 位unzip.exe兼容性没问题)
完成后,在任意 CMD 或 PowerShell 窗口里直接运行 unzip -v 即可验证。不推荐用第三方压缩软件附带的 unzip.exe,它们常缺少 ZIP64 支持,Composer 会拒绝使用。
最容易被忽略的一点:Alpine 镜像里装了 unzip 也不代表 Composer 能用——busybox 自带的 unzip 不支持数据描述符,Composer 明确跳过它。必须用 apk add unzip 安装完整版,且不能漏掉 --no-cache。











