确认libzip版本太低而非zip扩展未装:需运行pkg-config --modversion libzip(低于1.6.0即危险)、php -r "echo ZIPARCHIVE::VERSION;"(返回值<10600说明绑定旧库),且php -m | grep zip有输出或new ZipArchive()不报错仍不足以证明可用。

不是 Composer 本身出错,而是 PHP 缺少 zip 扩展或底层 libzip 库不兼容 —— 直接装扩展通常能解决,但若系统库太旧或 PHP 是源码编译的,就得动 libzip 或重编。
怎么确认是 libzip 版本太低,不是 zip 扩展没装?
光看 php -m | grep zip 有输出、甚至 php -r "new ZipArchive();" 不报错,还不够。某些老系统(如 CentOS 7 自带 libzip 0.10、Alpine 默认 libzip 1.5)会让 ZipArchive::extractTo() 静默失败,Composer 日志里只显示 Failed to extract,加 -v 才能看到真实错误:libzip version too old。
验证方法:
- 运行
pkg-config --modversion libzip(Linux/macOS),低于1.6.0就危险 - Docker 或 Alpine 用户:
apk list | grep libzip,确认是否为libzip-1.9.2-r0或更高 - PHP 中查实际绑定版本:
php -r "echo ZIPARCHIVE::VERSION;\n";,返回10600表示 libzip 1.6.0,低于此值说明绑定的是旧库
Ubuntu/Debian 下 libzip 太旧,不能只 apt install php-zip
系统仓库里的 libzip-dev 和 php-zip 常捆绑旧版 libzip(比如 Ubuntu 22.04 默认 libzip 1.7.1,但某些镜像仍卡在 1.5)。硬装 php-zip 只会加载旧库,ZipArchive 依然不可靠。
立即学习“PHP免费学习笔记(深入)”;
正确做法是先升级 libzip,再重装 zip 扩展:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 下载新版 libzip 源码(如
libzip-1.10.1),解压后./configure --prefix=/usr && make && sudo make install - 确保
/usr/lib/pkgconfig/libzip.pc已更新,再运行sudo apt install --reinstall php-zip - 重启 CLI 环境(关掉终端重开),用
php -r "echo ZIPARCHIVE::VERSION;"确认返回 ≥11001
自己编译的 PHP 没 zip 支持,不能只改 php.ini
如果 PHP 是用 ./configure 编译的,且当初没加 --with-libzip 或 --enable-zip,那光在 php.ini 里写 extension=zip.so 是无效的——根本没生成这个文件。
必须重编,但不用全量重装:
- 进 PHP 源码目录,检查是否已有
ext/zip/子目录(PHP 7.4+ 默认自带) - 重新运行
./configure --with-libzip=/usr --enable-zip(路径按你装的 libzip 调整) -
make后别make install全局覆盖,先试make -C ext/zip看能否单独编出zip.so - 若成功,把生成的
zip.so手动拷到extension_dir下,并在php.ini加extension=zip
注意:make install 会覆盖 php.ini,但不会自动加 extension 行,这步必须手动补。
Docker Alpine 镜像里 zip 扩展“装了却失效”的典型链路
Alpine 的坑是分层的:缺 zlib-dev → 编译 zip 扩展失败 → 即使 docker-php-ext-install zip 看似成功,实际生成的 zip.so 也因链接不到 zlib 而无法加载。
标准构建顺序不能错:
-
RUN apk add --no-cache zlib-dev libzip-dev(顺序不能反,libzip 依赖 zlib) -
RUN docker-php-ext-install zip(此时才真正能编出可用的 zip.so) -
RUN docker-php-ext-enable zip(生成docker-php-ext-enable对应的 ini 文件) - 最后用
php -r "new ZipArchive();"验证,而不是只信php -m
漏掉 zlib-dev,哪怕 libzip-dev 装了,ZipArchive 类也会在运行时触发 undefined symbol: deflateInit2_ 错误,这种问题只在解压瞬间暴露,极难定位。


















