关于 PHP7.1 中 zip 压缩的说明

大家好,
我是开发团队野生队的成员 Mandai。

我当时在 PHP 7.1 环境下开发一个内容,有人用 PHP 写了一些代码来压缩 zip 文件。
我想合并代码、检查一下然后发布,但这花了一些时间,所以我想分享一下解决方案。

一开始出现了一个错误,提示没有 ZipArchive 文件。

合并并运行后,出现以下错误:

错误 - 在 APPPATH/classes/logic/monitoring.php 第 721 行找不到类“ZipArchive”

 

当然,这是因为该模块尚未安装,所以我将尝试安装它。

当前已安装的 PHP 模块如下:

$ yum list installed | grep php php.x86_64 7.1.22-1.el7.remi @remi-php71 php-cli.x86_64 7.1.22-1.el7.remi @remi-php71 php-common.x86_64 7.1.22-1.el7.remi @remi-php71 php-devel.x86_64 7.1.22-1.el7.remi @remi-php71 php-fpm.x86_64 7.1.22-1.el7.remi @remi-php71 php-gd.x86_64 7.1.22-1.el7.remi @remi-php71 php-json.x86_64 7.1.22-1.el7.remi @remi-php71 php-mbstring.x86_64 7.1.22-1.el7.remi @remi-php71 php-mcrypt.x86_64 7.1.22-1.el7.remi @remi-php71 php-mysqlnd.x86_64 7.1.22-1.el7.remi @remi-php71 php-pdo.x86_64 7.1.22-1.el7.remi @remi-php71 php-pecl-imagick.x86_64 3.4.3-8.el7.remi.7.1 @remi-php71 php-xml.x86_64 7.1.22-1.el7.remi @remi-php71

 

这并非事实。
我们来检查一下PHP正在加载的模块。

$ php -m [PHP Modules] bz2 calendar Core ctype curl date dom exif fileinfo filter ftp gd gettext hash iconv imagick json libxml mbstring mcrypt mysqli mysqlnd openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar readline Reflection session SimpleXML sockets SPL sqlite3 standard tokenizer wddx xml xmlreader xmlwriter xsl # 应该在这里 zlib

 

没有。
所以我们用 yum 快速安装一下。

 

使用 yum 安装 php-pecl-zip

PHP 是用 yum 安装的,所以这次我们将再次使用 yum 安装它。

$ yum install --enablerepo=remi-php71 php-pecl-zip 已加载插件:fastestmirror 正在从缓存的主机文件加载镜像速度 * base: ftp.jaist.ac.jp * epel: mirrors.kernel.org * extras: ftp.jaist.ac.jp * remi-safe: ftp.riken.jp * updates: ftp.jaist.ac.jp 已安装与 php-common-5.4.16-45.el7.x86_64 匹配的软件包。正在检查更新。.

 

我被以一种奇怪的方式训斥了。
我使用的 PHP 版本是 7.1,所以因为 php-common-5.4 的原因而无法安装它,这很奇怪。

由于这是一个 PECL 模块,我们不妨直接编译它。

 

编译 PECL 模块

PECL::Package::zip源代码

$ phpize 配置: PHP API 版本:20160303 Zend 模块 API 编号:20160303 Zend 扩展 API 编号:320160303 $ ./configure 检查 grep 检查是否支持长行和 -e 选项... /bin/grep 检查 egrep... /bin/grep -E 检查是否支持不截断输出的 sed 选项... /bin/sed 检查 cc... cc 检查 C 编译器是否工作... 是 检查 C 编译器默认输出文件名... a.out 检查可执行文件的后缀... 检查是否进行交叉编译... 否 检查目标文件的后缀... o 检查是否使用 GNU C 编译器... 是 检查 cc 是否接受 -g 选项... 是 检查 cc 是否支持 ISO C89 选项... 无需 检查如何运行 C 预处理器... cc -E 支持 icc... 不支持 suncc... 不支持 检查 cc 是否支持 -c 和 -o 选项... 是检查系统库目录... lib 检查编译器是否支持 -R... 否 检查编译器是否支持 -Wl,-rpath,... 是 检查构建系统类型... x86_64-unknown-linux-gnu 检查主机系统类型... x86_64-unknown-linux-gnu 检查目标系统类型... x86_64-unknown-linux-gnu 检查 PHP 前缀... /usr 检查 PHP 头文件... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib 检查 PHP 扩展目录... /usr/lib64/php/modules 检查已安装的 PHP 头文件前缀... /usr/include/php 检查是否启用调试... 否 检查是否启用 zts... 否 检查 re2c... 否 配置:警告:您需要如果您想重新生成 PHP 解析器,请使用 re2c 0.13.4 或更高版本。正在检查 gawk... gawk 正在检查 zip 归档文件的读写支持... 是,共享 正在检查 libzip... 是 正在检查 PHP 版本... PHP 7.0 - 7.2 正在检查 pkg-config... /bin/pkg-config 正在检查 libzip... configure:错误:系统 libzip 必须升级到版本 >= 0.11

 

有人告诉我我的libzip版本太低了。
我可以尝试升级libzip版本,但我不想处理随之而来的各种问题,所以我做了一些搜索。

相关信息不多。
关于安装 PHP 的文章有很多,但提到 php-pecl-zip 的文章数量却急剧下降。即使将范围扩大到英文,这种情况也可能非常罕见。

 

怀疑它其实很美味?

让我们换个思路,回归基础,看看 yum 的运行结果。
我用 yum 安装的时候,因为 php-common 的问题,安装停止了,所以我当时想,如果我能绕过它,也许就能解决问题。

$ yum install --enablerepo=remi-php71 php-pecl-zip --exclude=php-common 已加载插件:fastestmirror 从缓存的主机文件加载镜像速度 * base: ftp.jaist.ac.jp * epel: mirrors.kernel.org * extras: ftp.jaist.ac.jp * remi-php71: ftp.riken.jp * remi-safe: ftp.riken.jp * updates: ftp.jaist.ac.jp 正在解析依赖关系 --> 正在运行事务检查 ---> 将安装软件包 php-pecl-zip.x86_64 0:1.15.3-1.el7.remi.7.1 --> 正在处理依赖关系:软件包需要 libzip5(x86-64) >= 1.5.1 php-pecl-zip-1.15.3-1.el7.remi.7.1.x86_64 --> 正在处理依赖项:软件包 php-pecl-zip-1.15.3-1.el7.remi.7.1.x86_64 的 libzip.so.5()(64bit) --> 正在运行事务检查 ---> 将安装软件包 libzip5.x86_64 0:1.5.1-1.el7.remi --> 依赖关系解析完成 ========================================================================================================================================== 软件包架构 版本 软件仓库 大小 ====================================================================================================================== 安装: php-pecl-zip x86_64 1.15.3-1.el7.remi.7.1 remi-php71 51 k 安装依赖项: libzip5 x86_64 1.5.1-1.el7.remi remi-safe 55 k 事务摘要===================================================================================================================== 安装 1 个软件包(+1 个依赖软件包) 总下载大小:107 k 安装大小:280 k 是否确定 [y/d/N]:y 正在下载软件包: (1/2): php-pecl-zip-1.15.3-1.el7.remi.7.1.x86_64.rpm | 51 kB 00:00:00 (2/2): libzip5-1.5.1-1.el7.remi.x86_64.rpm | 55 kB 00:00:00 ------------------------------------------------------------------------------------------------------------------ 总计 214 kB/s | 107 kB 00:00:00 正在运行事务检查 正在运行事务测试 事务测试成功 正在运行事务 安装:libzip5-1.5.1-1.el7.remi.x86_64 1/2 安装:php-pecl-zip-1.15.3-1.el7.remi.7.1.x86_64 2/2 验证:libzip5-1.5.1-1.el7.remi.x86_64 1/2 验证:php-pecl-zip-1.15.3-1.el7.remi.7.1.x86_64 2/2 已安装:php-pecl-zip.x86_64 0:1.15.3-1.el7.remi.7.1 依赖项已安装:libzip5.x86_64 0:1.5.1-1.el7.remi 完成!

 

似乎在依赖关系解析过程中安装了一个新的 libzip 库,但 php-pecl-zip 已经成功安装!
它的名称不同,是 libzip5,所以应该没问题!

 

概括

在 CentOS 中,标准 yum 仓库中注册的 PHP 版本仍然是版本 5,所以如果能对此进行一些改进就好了,但是通过使用 --exclude 选项排除 php-common,我能够在不进行不必要的依赖项解析的情况下安装它。

由于 yum 的表现相当不错,这种情况很少见。
如果您使用 PHP 压缩文件,则需要注意 PHP 的版本。

就这样。

如果您觉得这篇文章有用,请点击【点赞】!
0
加载中...
0票,平均分:0.00/10
15,685
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但我也很荣幸能够从事其他各种工作,包括市场营销。
我在Beyond中的肖像权采用CC0协议。