PHP环境ZipArchive类缺失求助:PhpSpreadsheet依赖配置失败
我来帮你梳理下这个困扰你的PHP Zip扩展配置问题,结合你的环境和已做的尝试,给你明确的排查方向和解决办法:
环境信息
- 操作系统:Red Hat Enterprise Linux Server release 7.4 (Maipo)
- PHP版本:7.1.14
你已尝试的方案及遇到的问题
方案1:通过yum安装remi源的zip扩展
你执行了以下命令:
yum install php71-php-pecl-zip.x86_64 cp /etc/opt/remi/php71/php.d/40-zip.ini /etc/php.d/40-zip.ini systemctl stop httpd.service systemctl start httpd.service
但浏览器运行PhpSpreadsheet时触发错误:
/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php: 71 Class 'ZipArchive' not found
有意思的是,终端CLI环境下的检测都显示ZipArchive已正常启用:
php --info # 关键输出片段 Additional. Ini files parsed => 路径 /etc/php.d/40-zip.ini zip Zip => enabled Zip version => 1.15.2 Libzip headers version => 1.3.2 Libzip library version => 1.5.1 php vendor/phpoffice/phpspreadsheet/samples/index.php # 检测结果 Requirement check: PHP 5.6.0 ... passed PHP extension XML ... passed PHP extension xmlwriter ... passed PHP extension mbstring ... passed PHP extension ZipArchive ... passed PHP extension GD (optional) ... passed PHP extension dom (optional) ... passed
方案2:尝试通过pecl编译安装zip扩展
你先撤销了方案1的设置,然后执行:
yum install php71-php-devel.x86_64 yum install zlib-devel.x86_64 pecl install zip
但pecl install zip直接报错:
No releases available for package "pecl.php.net/zip"
install failed
随后手动下载源码包执行phpize时,又遇到:
Can not find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
排查要点与解决方案
核心问题:CLI PHP与Apache PHP环境不统一
这是这类问题最常见的根源——你在终端用php --info看到的是CLI版本的PHP配置,但Apache运行的是另一个独立的PHP实例(你安装的remi php71模块),二者的配置路径和加载的扩展完全分离,所以CLI检测正常但web环境报错。
具体解决步骤
确认Apache使用的PHP环境
在你的web根目录创建一个phpinfo.php文件,内容如下:<?php phpinfo(); ?>通过浏览器访问这个文件,重点查看:
Loaded Configuration File:确认Apache加载的PHP配置文件路径(应该是/etc/opt/remi/php71/php.ini,而非系统默认的/etc/php.ini)Additional .ini files parsed:确认加载的扩展配置目录(应该是/etc/opt/remi/php71/php.d/)
修正方案1的配置操作
你之前错误地把remi php71的zip配置文件复制到了系统默认PHP的配置目录,而Apache实际加载的是remi自己的配置目录。正确操作如下:# 确保remi php71的zip扩展已安装 yum install php71-php-pecl-zip.x86_64 # 确保Apache启用的是remi php71模块(如果没装过的话) yum install php71 # 重启Apache使配置生效 systemctl restart httpd之后刷新web端的phpinfo.php,确认
zip扩展已出现在列表中。解决pecl安装的问题(备选方案)
如果你坚持用pecl编译安装,必须使用remi php71对应的工具链,而不是系统默认的:# 使用remi php71的pecl工具 /opt/remi/php71/bin/pecl install zip如果手动编译源码包,也要用对应的phpize:
tar zxf zip-1.15.2.tgz cd zip-1.15.2 /opt/remi/php71/bin/phpize ./configure --with-php-config=/opt/remi/php71/bin/php-config make && make install编译完成后,把生成的
zip.so配置到/etc/opt/remi/php71/php.d/目录下,再重启Apache。最终验证
无论用哪种方式安装,一定要通过web端的phpinfo.php确认ZipArchive类存在,或者直接运行PhpSpreadsheet的功能代码测试,不要只依赖CLI环境的检测结果。
内容的提问来源于stack exchange,提问作者ta96

