“Unzip with unzip command failed”是Composer因系统缺少unzip命令而报错,需安装unzip/zip工具而非仅启用PHP zip扩展;常见于Alpine、Ubuntu Server、Docker及WSL等最小化环境。

“Unzip with unzip command failed” 是什么问题
这个报错不是 PHP 扩展没开,而是 Composer 在底层尝试调用系统 unzip 命令失败后,才退回到 ZipArchive 类——但如果你连 unzip 命令都没有,又没启用 zip 扩展,就会卡死或报错。常见于最小化安装的 Linux(如 Alpine、Ubuntu Server)、Docker 容器或 WSL 环境。
Linux 下必须装 unzip 和 zip 命令
Composer 默认优先用系统 unzip 解压下载的包(更快、更稳),而不是纯 PHP 实现。所以光开 PHP 的 zip 扩展还不够,命令行工具本身得存在。
- Ubuntu/Debian:
sudo apt update && sudo apt install -y unzip zip - CentOS/RHEL 8+:
sudo dnf install -y unzip zip - Alpine(Docker):
RUN apk add --no-cache unzip zip - 验证是否装好:
unzip -v或which unzip,有输出才算成功
为什么只装 php-zip 还不够
很多人以为装了 php-zip 就万事大吉,但 Composer 的行为是:先找 unzip 命令 → 找不到才 fallback 到 ZipArchive → 如果 ZipArchive 也没加载,就直接报错。而有些基础镜像(比如官方 php:8.2-cli)连 unzip 都不预装,php-zip 却可能已内置——这时你 php -m | grep zip 显示正常,但 Composer 仍报错,就是这个原因。
-
php -r "echo class_exists('ZipArchive') ? 'OK' : 'Missing';"只能验证类是否存在,不能代替unzip命令检查 - Docker 构建时,
RUN apt install unzip必须放在RUN composer install之前,且不能被缓存跳过 - WSL 用户如果用的是 Ubuntu minimal,
php-cli包默认不带unzip,必须手动补
如何确认是命令缺失而非扩展问题
别猜,用两条命令快速定位:
- 查命令:
which unzip—— 没输出?立刻装unzip - 查类:
php -r "echo class_exists('ZipArchive') ? 'OK' : 'Missing';"—— 输出Missing?再看php --ini对应的php.ini是否启用了extension=zip.so - 两者都 OK,再运行
composer install -vvv,看日志里 fallback 发生在第几步
最容易被忽略的是:CLI 和 Web 使用的 php.ini 不同,但 Composer 只认 CLI 的;而 unzip 命令不存在,连 CLI 层都过不去——这时候修 php.ini 根本没用。










