PHP Zip扩展未启用会导致composer install解压失败,需根据系统安装对应php-zip包或启用php.ini中的extension=zip,并确保libzip≥1.6.0。

PHP Zip 扩展没启用,composer install 直接报错
Composer 在解压包(比如从 packagist 下载 .zip 归档)时依赖 PHP 的 zip 扩展。没启用就卡在 Failed to download xxx: zip extension not available 或类似提示,不是网络问题,也不是权限问题——是 PHP 根本不认 zip 文件。
验证方式很简单:php -m | grep zip,没输出就确认缺失;或者运行 php -i | grep "zip support",返回 zip support => disabled 也一样。
- Linux(apt 系统):装
php-zip包,不是libzip-dev(那是编译用的);不同 PHP 版本要带后缀,比如 PHP 8.2 就得装php8.2-zip - macOS(Homebrew):运行
brew install php@8.2(或对应版本)会自动连带启用 zip;如果已装但没启,检查/opt/homebrew/etc/php/8.2/conf.d/ext-zip.ini是否存在且未被注释 - Windows:打开
php.ini,取消;extension=zip前的分号;注意路径下必须有php_zip.dll,且和 PHP 版本(TS/NTS、x64/x86)严格匹配
用 composer require 装 ext-zip 是无效操作
ext-zip 不是 Composer 包,它是 PHP 内置扩展,不能通过 composer require 安装或“声明依赖”来解决。你在 composer.json 里写 "ext-zip": "*" 只会让 composer install 检查它是否存在——不存在就报错,不会帮你装。
常见误解是以为加了这个就能“自动补全”,其实它只是个运行时约束项,类似 php: ^8.1,只校验不安装。
立即学习“PHP免费学习笔记(深入)”;
- 检查是否误写了
"require": {"ext-zip": "*"}却没配好环境,结果反复失败 - CI/CD 流水线里记得在
composer install前明确安装并启用 zip 扩展,例如 GitHub Actions 中用shivammathur/setup-php时加extensions: zip - Docker 用户别只 COPY
composer.lock,基础镜像得含 zip;php:8.2-cli默认不含,要用php:8.2-cli-bullseye并手动docker-php-ext-install zip
composer create-project 失败,可能卡在 zip 解包阶段
这个命令本质是先下载项目压缩包再解压,比 install 更早触发 zip 依赖。错误信息常为 Could not delete /tmp/xxx: Permission denied 或静默中断——其实底层是 ZipArchive::extractTo() 失败,但 Composer 把异常吞了,只留模糊提示。
别急着改权限或清缓存,先确认 zip 扩展可用;尤其 Docker 或容器化环境,容易漏掉 unzip 系统命令(虽然 Composer 优先用 PHP zip 扩展,但 fallback 会调系统 unzip)。
- 运行
php -r "new ZipArchive();",无报错才说明扩展加载成功 - 某些精简版 PHP(如 Alpine 的
php:8.2-cli-alpine)需同时装zip系统包:apk add zip - Windows WSL 用户注意:如果用的是 Microsoft Store 版 PHP,zip 扩展可能默认禁用,仍需手动改
php.ini
Zip 扩展启用后仍报错,大概率是 libzip 版本太老
PHP 8.0+ 要求 libzip ≥ 1.6.0,旧系统(如 Ubuntu 18.04 自带 libzip 1.5.1)即使开了 zip 扩展,也会在解压某些新格式 zip(比如 ZIP64、AES 加密)时崩溃或静默失败。
现象是 composer install 随机中断、提示 unable to decompress 或直接 segfault,strace 可看到 openat(AT_FDCWD, "/proc/self/fd/3", ...) 后挂掉。
- Ubuntu/Debian:升级到新版源,或手动编译 libzip 1.9+ + 重装 php-zip
- macOS:用
brew upgrade libzip,再brew reinstall php@8.2 - 检查实际绑定版本:
php -i | grep "libzip",输出应为libzip version => 1.9.2这类
Zip 扩展不是开关一开就万事大吉,它的底层依赖、系统命令 fallback、libzip ABI 兼容性都可能在某个环节断掉——尤其是跨平台部署或复用旧基础镜像时,最容易漏掉 libzip 版本这一层。










