需手动编译安装libzip 1.9.2并配置pkg-config路径:先卸载旧版,下载解压libzip-1.9.2,执行./configure --prefix=/usr/local --enable-shared --enable-static,make && make install,再设置pkg_config_path并验证zipconf.h存在。

宝塔PHP扩展报错“zipconf.h: No such file or directory”怎么修
这是典型的 libzip 头文件缺失,不是没装 libzip,而是装了但没装开发头文件,或者装在非标准路径导致 PHP 编译时找不到 zipconf.h。
常见于 CentOS/Rocky 8+、Debian 12 或手动升级过 libzip 的环境。系统包管理器装的 libzip-devel(RHEL系)或 libzip-dev(Debian系)往往版本太低(如 1.5.x),而 PHP 7.4+ 需要 ≥ 1.7.3 才能正常编译 zip 扩展。
- 先确认当前
libzip版本:pkg-config --modversion libzip,低于 1.7.3 就得换 - 别用
yum install libzip-devel或apt install libzip-dev应急——它们通常只提供 1.5.x,且头文件路径不统一 - 必须手动编译安装新版
libzip,并确保zipconf.h被安装到系统可查路径(如/usr/local/include)
手动编译 libzip 1.9.2(推荐稳定版)的实操步骤
选 1.9.2 是因为它兼容 PHP 7.3–8.2,且绕过了 1.10+ 引入的 ABI 变更风险。以下命令按顺序执行,路径和权限不能跳:
- 清理旧版:
yum remove -y libzip libzip-devel(CentOS/Rocky)或apt purge -y libzip-dev libzip5(Debian/Ubuntu) - 下载并解压:
wget https://libzip.org/download/libzip-1.9.2.tar.gz && tar -xzf libzip-1.9.2.tar.gz && cd libzip-1.9.2 - 配置安装路径(关键!):
./configure --prefix=/usr/local --enable-shared --enable-static - 编译安装:
make -j$(nproc) && make install - 刷新动态库缓存:
echo '/usr/local/lib' > /etc/ld.so.conf.d/libzip.conf && ldconfig
完成后验证:ls -l /usr/local/include/zipconf.h 必须存在;pkg-config --modversion libzip 应输出 1.9.2。
为什么 phpize 编译 zip 扩展仍失败?检查这三个点
即使 libzip 装好了,PHP 扩展编译还可能卡在 configure 或 make 阶段,原因很具体:
-
configure报 “libzip >= 0.11 not found”:说明pkg-config没找到libzip.pc—— 它默认装在/usr/local/lib/pkgconfig/,需加环境变量:export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" -
make报 “undefined reference to zip_source_filep”:是静态链接未启用,重进libzip-1.9.2目录,补运行:make clean && ./configure --prefix=/usr/local --enable-static --enable-shared && make && make install - 编译成功但
php -m | grep zip不显示:确认extension=zip.so已写入正确的php.ini(比如/www/server/php/74/etc/php.ini),且没被其他;extension=行注释掉
Debian/Ubuntu 用户特别注意 libzip 头文件路径冲突
Debian 系统自带的 libzip-dev 会把头文件装到 /usr/include,而手动编译的 libzip 默认装到 /usr/local/include。如果两者共存,phpize configure 可能混用头文件和库,导致运行时报 undefined symbol: zip_libzip_version。
- 彻底清除系统版:
apt purge -y libzip-dev libzip5,再find /usr -name "zip.h" -o -name "zipconf.h" 2>/dev/null | xargs rm -f - 确保
/usr/local/include是唯一来源,且pkg-config --cflags libzip输出含-I/usr/local/include - 若 PHP 编译参数里有
--with-libzip,必须显式指定:--with-libzip=/usr/local,否则它会优先找/usr
手动编译 libzip 不是权宜之计,而是必要步骤——宝塔面板至今未适配新版 libzip 的路径约定,跳过这步,ZipArchive 扩展永远处于“已安装但不可用”状态。











