不知道什么情况,php 7.4-8.2 的所有版本默认没编译 zip 扩展,查看相关插件模块目录,是有编译成品的 .so 文件,看起来是编译时刻意没有加入模块参数?
编译了一份此时此刻最新版 zstd v1.5.5-kernel、libzip v1.10.1、zip v1.22.3、 xz ,开箱即用,仅支持 php 8.0.x 版本开箱即用,注意自行重命名为 zip.so
,编译成品文件下载地址:
zip.so
https://www.alipan.com/s/EKA47SmMnDu
提取码: 7j6j
下载后传到服务器,覆盖同名文件,重启 PHP 相关服务立刻生效
更新:2024-1-12 又编译了一份 php 7.3.x 的最新版 zip.so,都是含 libzip v1.10.1、zip v1.22.3、 xz 支持,注意自行重命名为 zip.so
zip.so-php7.3.x.so
https://www.alipan.com/s/SmVVqwWvsGy
提取码: 2zg1
以此刻我的 php8.0 没有默认编译进去的 zip 扩展为例,手动添加
进入 /www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/
下载此时的最新模块版本 2023-11-14 发布的 v1.22.3 zip
可以自行访问 http://pecl.php.net/package/zip
查看此时的最新版本
wget http://pecl.php.net/get/zip-1.22.3.tgz
加权限并解压
chmod +x zip-1.22.3.tgz && tar zxvf zip-1.22.3.tgz && cd zip-1.22.3
编译
/www/server/php/80/bin/phpize
./configure --with-php-config=/www/server/php/80/bin/php-config
重新安装 php8.0
make && make install
修改 php 配置启用 zip 扩展
echo "extension=/www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/zip.so" >> /www/server/php/80/etc/php.ini
重启 php-fpm
/etc/init.d/php-fpm-80 reload
此时 phpinfo 已经有扩展信息,输出信息中发现不过不是完全体,可能什么参数或者依赖没有,缺少 xz / zstd
支持
zip
Zip enabled
Zip version 1.22.3
Libzip version 1.7.3
BZIP2 compression Yes
XZ compression No
ZSTD compression No
AES-128 encryption Yes
AES-192 encryption Yes
AES-256 encryption Yes
强迫症发作,搞都搞了,必须实现完全体,重新编译
检查相关包都实际上安装了,以防万一重装,zstd 用最新版
zstd github:https://github.com/facebook/zstd/archive/refs/tags/v1.5.5-kernel.zip
源码编译安装 zstd
unzip v1.5.5-kernel.zip && cd zstd-1.5.5-kernel/ && make && make install
重装 libmbedtls
apt reinstall -y libmbedtls-dev
发现 cmake 没有添加相关库文件的路径,手动添加
cmake -D_zstd_LIBRARY=/usr/lib/x86_64-linux-gnu -Dzstd_INCLUDE_DIR=/usr/include
cmake -DMbedTLS_LIBRARY=/usr/lib/x86_64-linux-gnu -Dzstd_INCLUDE_DIR=/usr/include
重新编译,并指定安装位置,然后这里踩了个小坑,指定安装位置时,头文件是不会安装到 /usr/include
,结果 php 编译时只认系统装的 libzip 版本,phpinfo 显示 handers 版本是 v1.7.3,所以之后要手动创建软连接覆盖系统的默认版本的头文件
cmake ./ --install-prefix /usr/local/libzip-1.10.1
查了下系统默认的 libzip,搜索关键字 libzip
,输出
/usr/lib/x86_64-linux-gnu/libzip.so
/usr/lib/x86_64-linux-gnu/libzip.so.4
/usr/lib/x86_64-linux-gnu/libzip.so.4.0
并且 ubuntu 此时此刻,v20、22、23 上面的软件包 libzip4 libzip-dev 最新版只有 v1.7.3,索性升级到最新版 v1.10.1
其中前面2个都是软连接,实际文件指向 /usr/lib/x86_64-linux-gnu/libzip.so.4.0
简单粗暴直接 ln -sf /usr/local/libzip-1.10.1/lib/libzip.so.5.5 /usr/lib/x86_64-linux-gnu/libzip.so.4.0
但是 handers 之类的头文件是没有的,手动为 /usr/local/libzip-1.10.1/include
下面的2个文件创建软连接
ln -sf /usr/local/libzip-1.10.1/include/zip.h /usr/include/zip.h
ln -sf /usr/local/libzip-1.10.1/include/zipconf.h /usr/include/zipconf.h
然后按照文章前面的方法重新编译 zip 扩展,因为更新了 libzip ,并且使用了自定义安装位置,我们需要手动指定 libizip 库路径
./configure --with-php-config=/www/server/php/80/bin/php-config --with-libzip=/usr/local/libzip-1.10.1
此时会使用源码编译安装 zip 扩展,并实现 zstd xz 支持
重启 php-fpm 之后,可以 php -m | grep zip 检查是否加载成功,并在 phpinfo 界面查看 zip 扩展的详细信息