飘在云端

东西南北,海角天涯

· 备查 · · 265次浏览

宝塔面板php没有默认安装zip扩展,手动编译添加

不知道什么情况,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 扩展的详细信息

请输入图片描述

评论 (0条)