当前位置: 首页> 最新文章列表> zip_entry_compressedsize() 怎么用?搭配 zip_read 函数读取压缩文件的实用技巧

zip_entry_compressedsize() 怎么用?搭配 zip_read 函数读取压缩文件的实用技巧

M66 2025-06-26

在处理 ZIP 压缩文件时,PHP 提供了一套非常方便的函数接口,zip_entry_compressedsize() 就是其中一个可以帮助开发者读取压缩文件中“已压缩数据大小”的函数。本文将结合 zip_read() 函数,演示如何有效地读取压缩文件内容以及相关的压缩信息。

一、什么是 zip_entry_compressedsize()

zip_entry_compressedsize() 是用于获取 ZIP 文件中单个条目的压缩后大小的函数。该函数接收由 zip_read() 返回的资源句柄作为参数,并返回对应压缩条目的压缩后大小(以字节为单位)。

函数原型如下:

int zip_entry_compressedsize(resource $zip_entry)

该函数的典型用途是在遍历压缩文件条目时,获取每个文件在压缩后的字节数,从而用于分析压缩率、评估性能或者预分配缓存。

二、与 zip_read() 配合使用的完整示例

我们以下面这段代码为例,展示如何打开一个 ZIP 文件,逐个读取条目,并获取每个文件的压缩大小。

$zipPath = '/path/to/example.zip';

$zip = zip_open($zipPath);
if (is_resource($zip)) {
    while ($zip_entry = zip_read($zip)) {
        echo "文件名: " . zip_entry_name($zip_entry) . "\n";
        echo "压缩后大小: " . zip_entry_compressedsize($zip_entry) . " 字节\n";
        echo "原始大小: " . zip_entry_filesize($zip_entry) . " 字节\n";
        
        if (zip_entry_open($zip, $zip_entry)) {
            $contents = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            // 在此可对内容进行处理,例如保存或分析
            zip_entry_close($zip_entry);
        }
        
        echo "-----------------------------\n";
    }
    zip_close($zip);
} else {
    echo "无法打开 ZIP 文件。\n";
}

说明:

三、使用场景示例

1. 显示压缩比率

你可以通过压缩前后的大小来计算压缩率,例如:

$compressed = zip_entry_compressedsize($zip_entry);
$original = zip_entry_filesize($zip_entry);
$rate = $original > 0 ? round(($compressed / $original) * 100, 2) : 0;
echo "压缩率: $rate%\n";

2. 文件筛选与分类

根据压缩大小可以快速筛选出大型文件或高压缩比的文件:

if (zip_entry_compressedsize($zip_entry) > 1024 * 100) {
    echo "这是一个大文件,压缩后大于 100KB。\n";
}

四、实际案例:读取远程 ZIP 文件中的内容

如果 ZIP 文件是来自远程,比如 https://m66.net/files/archive.zip,可以先用 file_get_contents() 下载到本地临时目录,再处理:

$tempFile = tempnam(sys_get_temp_dir(), 'zip');
file_put_contents($tempFile, file_get_contents('https://m66.net/files/archive.zip'));

$zip = zip_open($tempFile);
if (is_resource($zip)) {
    // 后续逻辑同上
    zip_close($zip);
    unlink($tempFile);
}

五、注意事项

  • 该函数在某些老版本 PHP 中存在兼容问题,推荐在 PHP 7 以上使用 ZipArchive 类来代替 zip_* 系列函数,但在某些场景中 zip_entry_compressedsize() 更直观。

  • 当处理含有大量条目的压缩包时,建议进行内存管理和错误处理,以免造成资源泄露或服务器崩溃。

六、结语

通过 zip_entry_compressedsize()zip_read() 的搭配,开发者可以轻松读取压缩包中的详细信息,适用于日志分析、远程数据包内容提取、在线解压服务等多种应用。掌握这些基础工具,能让你在 PHP 文件处理方面更加得心应手。