PHP ZipArchive类无法解压Deflate64压缩ZIP文件的解决方案问询
解决PHP ZipArchive无法提取Deflate64压缩ZIP文件的问题
问题根源
PHP的ZipArchive类依赖底层的libzip库,而libzip默认未启用Deflate64压缩算法支持,这就是ZipArchive::isCompressionMethodSupported(ZipArchive::CM_DEFLATE64)返回false、解压失败的核心原因。
解决方案
1. 重新编译libzip与PHP Zip扩展(服务器层面)
若拥有服务器权限,可通过重新编译组件开启Deflate64支持:
- 下载libzip源码,编译时添加
--enable-deflate64参数:./configure --enable-deflate64 make && make install - 重新编译PHP的zip扩展,确保链接到新编译的libzip:
pecl uninstall zip pecl install zip - 重启PHP服务后,再次检测
ZipArchive::isCompressionMethodSupported(ZipArchive::CM_DEFLATE64)应返回true,原有解压代码即可正常运行。
2. 调用外部命令行工具解压(无需服务器编译)
若无服务器权限,可通过PHP调用系统解压工具(如7z或支持Deflate64的unzip)处理压缩包:
示例代码:
// 使用7z解压 $zipPath = 'deflate64.zip'; $extractDir = '/tmp/test_extract'; $command = "7z x {$zipPath} -o{$extractDir} -y"; exec($command, $output, $returnVar); if ($returnVar === 0) { echo '解压成功'; } else { echo '解压失败: ' . implode(PHP_EOL, $output); } // 或使用支持Deflate64的unzip工具 $command = "unzip {$zipPath} -d {$extractDir}"; exec($command, $output, $returnVar);
注意:需确保服务器已安装对应工具,且PHP的exec/shell_exec函数未被禁用。
3. 使用第三方PHP库
部分纯PHP实现的ZIP处理库原生支持Deflate64,比如PhpZip:
先通过Composer安装:
composer require nelexa/zip
再使用库解压:
use Nelexa\Zip\ZipFile; $zipFile = new ZipFile('deflate64.zip'); $zipFile->extractTo('/tmp/test_extract'); $zipFile->close();
该库不依赖系统libzip,兼容性更强。
内容的提问来源于stack exchange,提问作者atmacola
相关产品推荐
相关产品推荐

