PHP 7.4 的 ZipArchive 扩展必须手动编译安装,因系统自带 libzip-0.10.1 被明确拒绝,需卸载旧包、编译 libzip-1.9.2 并指定路径配置,再通过 phpize 编译扩展;PHP 7.2 报错多因扩展未启用、路径权限不足或中文名未转 GBK,非代码错误。

PHP 7.4 的 ZipArchive 扩展必须手动编译安装,不能靠 yum install php-zip 或宝塔一键安装解决;PHP 7.2 压缩解压报错,90% 是扩展未启用或路径权限/编码问题,不是代码写错了。
PHP 7.4 安装 ZipArchive 为什么 configure 总报 “Package 'libzip' not found”
这不是没装 libzip,而是装了但 pkg-config 找不到——系统自带的 libzip-0.10.1 被 PHP 7.4 明确拒绝,而你又没告诉 configure 去哪找新版。
- 先卸载旧包:
yum remove libzip libzip-devel(CentOS/Rocky/AlmaLinux)或apt-get remove libzip-dev(Debian/Ubuntu) - 从 libzip.org 下载
libzip-1.9.2.tar.xz(截至 2026 年最新稳定版),解压后执行:./configure --prefix=/usr/local/libzip make && make install
- 让 pkg-config 知道新库位置:
echo '/usr/local/lib/pkgconfig' > /etc/ld.so.conf.d/libzip.conf && ldconfig,再验证:pkg-config --modversion libzip输出应为1.9.2 - 进宝塔 PHP 源码目录:
cd /www/server/php/74/src/ext/zip/,然后运行:/www/server/php/74/bin/phpize ./configure --with-php-config=/www/server/php/74/bin/php-config --with-libzip=/usr/local/libzip make && make install
PHP 7.2 ZipArchive 报错:open() 返回 false 或 addFile 失败
这类错误不报具体异常,只返回 false,本质是底层调用失败,得逐层验证。
- 先确认扩展真加载了:
/www/server/php/72/bin/php -m | grep zip,没输出就白搭;再检查php.ini路径是否对:/www/server/php/72/bin/php --ini - 检查 ZIP 文件路径是否可写:
is_writable('/path/to/archive.zip'),且 PHP 进程用户(如www)有该目录的w权限,别只 chmod 755 目录就完事 -
ZipArchive::open()必须用绝对路径,相对路径在 CLI 和 Web 环境下行为不一致;传入前用realpath()验证文件存在:realpath('/var/www/html/test.zip') - 中文文件名必须转 GBK(Windows 兼容)或用
iconv('UTF-8', 'GBK', $filename),否则addFile()会静默失败
宝塔环境下 PHP 7.3/7.4 共存时 zip.so 路径容易写错
不同 PHP 版本的 zip.so 不通用,且宝塔默认不把扩展写进全局 php.ini,写错路径就是“配置写了却没生效”。
立即学习“PHP免费学习笔记(深入)”;
- PHP 7.3 的扩展路径是:
/www/server/php/73/lib/php/extensions/no-debug-non-zts-20180731/zip.so - PHP 7.4 的扩展路径是:
/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/zip.so - 务必确认
extension=zip.so这行写在对应版本的php.ini里(如/www/server/php/74/etc/php.ini),不是主配置或子目录下的user.ini - 重启用
service php-fpm-74 reload,不是restart;reload 不中断请求,还能立刻看到php -m是否生效
最常被跳过的一步:ZipArchive::open() 后没检查返回值就直接 addFile()。哪怕 ZIP 文件路径权限、编码、扩展都对,open 失败也会让后续所有操作无效。别依赖 class_exists('ZipArchive') 就以为万事大吉——它只说明类存在,不代表能用。



















