phpEnv下zip扩展必须手动编译安装,不能用系统包管理器;需先装libzip-dev/devel,再源码编译启用--enable-zip,最后在phpenv对应php.ini中添加extension=zip并重启服务。

phpEnv 下 zip 扩展装不上,基本不是配置问题,而是根本没走对安装路径——它不认系统级包管理器,也不自动加载 extension=zip。
phpEnv 的 zip 扩展必须手动编译安装,不能靠 apt/yum/brew
phpEnv 是纯脚本管理的 PHP 多版本环境,所有扩展都得用 pecl 或源码编译,sudo apt install php-zip 这类命令完全无效。它甚至不会读取系统 /etc/php/*/cli/conf.d/ 下的配置。
- 先确认当前 phpEnv 使用的 PHP 版本和路径:
phpenv version和which php - 进入对应版本源码目录(如
~/.phpenv/versions/8.2.10/src),或用phpenv install --reinstall 8.2.10重新构建 - 编译前必须装好
libzip-dev(Ubuntu/Debian)或libzip-devel(CentOS/RHEL),否则 configure 直接报错configure: error: system libzip not found - 运行:
cd ~/.phpenv/plugins/php-build/source/8.2.10 && ./configure --with-libzip=/usr --enable-zip && make && make install(路径按实际调整)
extension=zip 不起作用?因为 phpEnv 默认不写入 php.ini
phpEnv 安装完 zip 后,php -m | grep zip 仍为空,大概率是 php.ini 里压根没加这行——它不会像系统包那样自动生成 20-zip.ini。
- 找到当前生效的
php.ini:php --ini看Loaded Configuration File - 编辑该文件,在
[PHP]段落末尾添加:extension=zip(PHP 8.0+ 必须用这个写法,php_zip.dll或zip.so都不行) - 注意:phpEnv 的 CLI 和 Web(如 Apache/Nginx)可能用不同
php.ini,phpinfo()页面看到的路径 ≠php --ini显示的路径 - 改完别忘了重启 Web 服务,或如果是 CLI 场景,直接重跑命令即可
class_exists('ZipArchive') 返回 false?检查 libzip 运行时依赖
即使 php -m 显示 zip,new \ZipArchive() 仍失败,常见原因是 libzip 共享库在运行时找不到。
立即学习“PHP免费学习笔记(深入)”;
- Linux 下运行:
ldd $(php-config --extension-dir)/zip.so | grep libzip,若输出为not found,说明libzip.so.5或类似版本库缺失 - 查已装 libzip 版本:
pkg-config --modversion libzip;再查 PHP 扩展链接的是哪个:readelf -d $(php-config --extension-dir)/zip.so | grep NEEDED | grep zip - 常见冲突:系统装了 libzip 1.10,但 PHP 编译时链接的是 1.9 —— 此时要么降级系统 libzip,要么重新编译 zip 扩展并指定
--with-libzip=/usr/local(如果自己编译过新版) - Windows 用户不用操心这个,但要确认
php.ini中extension_dir指向的目录下真实存在php_zip.dll或zip.dll
最常被跳过的一步:phpEnv 切换版本后,php --ini 路径会变,但人容易惯性去改旧版本的 php.ini。每次 phpenv local 8.2 或 phpenv global 8.2 后,务必重新执行 php --ini 确认配置文件位置。



















