PHP 解压 RAR 与 ZIP 文件的完整配置及代码实现

不晚
不晚
发布时间:2026-10-14 | 2人浏览过
原创

PHP默认环境下无法直接处理RAR压缩格式,仅对ZIP有良好支持。若业务需要解压RAR或通用归档文件,必须通过PECL加载第三方扩展库。本文将详细说明如何通过配置php.ini启用php_rar扩展,并解决Windows环境下的路径编码问题,提供可运行的PHP解压缩核心代码。

准备条件与依赖分析

在开始操作前,需明确不同压缩格式的兼容性差异:

  • ZIP 文件:PHP内置支持,可直接使用 ZipArchive 类进行读写,无需额外安装扩展。
  • RAR 文件:受版权保护,PHP未内置标准库。需借助社区维护的 php_rar 扩展,该扩展基于 PECL 库开发,主要依赖系统底层的 RAR 引擎接口。

本方案主要针对 Windows IIS/Nginx/Apache + PHP 环境,Linux 环境下需编译安装对应动态链接库。注意:在执行任何覆盖或安装操作前,请务必备份现有 php.ini 配置文件及重要数据,以防配置错误导致服务不可用。

第1步:获取并安装 php_rar 扩展

RAR 扩展并非 PHP 官方发行版的一部分,需要从 PECL 仓库下载。请根据 PHP 版本和线程安全(TS/NTS)特性选择合适的 DLL 文件。

1. 下载对应版本的 DLL

  • 访问 PECL RAR 页面:http://pecl.php.net/package/rar。
  • 选择与你 PHP 版本严格匹配的发布包(例如 PHP 7.x 或 8.x)。
  • 根据你的运行环境选择线程安全(Thread Safe, TS)或非线程安全(Non Thread Safe, NTS)版本。通常 Apache 模块模式使用 TS,Nginx/FastCGI 模式多使用 NTS。不确定时可尝试默认提供的 TS 版本。

2. 放置扩展文件

  • 将下载包内的 php_rar.dll 文件复制到你 PHP 安装目录的 ext 文件夹下。
  • 确保当前用户对该文件拥有读取权限。

第2步:配置 php.ini 启用扩展

找到你的 php.ini 文件(可通过创建包含 phpinfo() 的脚本查看实际加载路径),添加以下行以激活扩展:

extension=php_rar.dll

保存修改后,必须重启 Web 服务器(如 IIS、Apache)以及对应的 PHP 进程管理器(如 PHP-CGI 或 FastCGI)。重启后,检查日志是否有报错信息。

第3步:编写解压逻辑代码

由于 RAR 协议的历史原因及编码差异,直接调用接口容易遇到中文乱码或路径提取失败的问题。以下代码展示了完整的解压流程,重点解决了文件名编码转换问题。

public function _unzip($fileName,$extractTO){
    // Windows下部分函数可能需要GBK编码才能正确识别中文路径,此处做转换
    // 若文件名全为英文,此步可省略
    $fileName = iconv('utf-8','gb2312',$fileName);
    
    $extractTo = $extractTO;
    
    // 打开RAR文件
    $rar_file = rar_open($fileName) or die('could not open rar');
    
    // 获取文件列表
    $list = rar_list($rar_file) or die('could not get list');
    
    // 遍历列表项
    foreach($list as $file) {
        // 正则匹配提取纯文件路径,过滤掉某些元数据字符
        $pattern = '/\".*\"/';
        preg_match($pattern, $file, $matches, PREG_OFFSET_CAPTURE);
        $pathStr = $matches[0][0];
        $pathStr = str_replace('\"','', $pathStr);
        
        // 根据路径获取具体条目对象
        $entry = rar_entry_get($rar_file, $pathStr) or die('entry not found');
        
        // 执行解压到目标目录
        $entry->extract($extractTo); 
    }
    
    // 关闭文件句柄
    rar_close($rar_file);
}

代码关键点解析

  1. 编码处理:iconv('utf-8','gb2312',...)。在某些旧版 Windows 系统中,Rar 内部的中文目录名存储格式可能与系统本地编码一致,PHP 传入 UTF-8 字符串时若不转换可能导致找不到文件或乱码。
  2. 正则匹配:$pattern = '/\".*\"/';。部分 Rar 库返回的文件名可能包裹在引号或其他特定字符中,此正则用于清洗名称,确保传递给 rar_entry_get 的路径准确无误。
  3. 资源释放:务必在循环结束后调用 rar_close($rar_file),防止内存泄漏或文件被锁定。

完成判断与排错

  • 验证安装:运行 php -m | grep rar (Linux) 或在 PHP info 页面查找 RAR 模块,确认扩展已加载。
  • 常见错误 1:Function not found。原因通常是未重启服务器或 php.ini 中 extension 路径填写错误。检查 extension_dir 设置是否正确指向 ext 目录。
  • 常见错误 2:Permission Denied。确保 PHP 运行账户(如 www-data, IUSR)对目标解压目录 $extractTO 拥有写入权限。
  • ZIP 简单做法:若只需处理 ZIP,可使用以下原生代码替代:
    $zip = new ZipArchive();
    if ($zip->open('file.zip') === true) {
        $zip->extractTo('./output_path/');
        $zip->close();
    }

简要总结

PHP 处理 RAR 文件的核心在于依赖 PECL 扩展生态。通过安装 php_rar.dll 并在配置中启用,配合正确的路径编码转换与资源管理,即可实现稳定的服务器端解压功能。对于单纯的 ZIP 格式,建议优先使用原生 ZipArchive 以获得最佳性能和兼容性。

以上就是PHP解压RAR及ZIP文件的详细内容,更多关于PHP文件处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表