clue / zlib-react

ReactPHP 的流式 zlib 压缩和解压缩器,支持 GZIP、ZLIB 和原始 DEFLATE 格式的压缩和解压缩。

v1.2.0 2023-08-04 14:26 UTC

This package is auto-updated.

Last update: 2024-09-04 17:12:20 UTC


README

CI status installs on Packagist

ReactPHP 的流式 zlib 压缩和解压缩器,支持 GZIP、ZLIB 和原始 DEFLATE 格式的压缩和解压缩。

目录

支持我们

我们投入了大量时间来开发、维护和更新我们出色的开源项目。您可以通过在 GitHub 上成为赞助商来帮助我们维持这种高质量的工作。赞助商将获得许多回报,有关详情请参阅我们的赞助页面

让我们共同努力将这些项目提升到新的高度!🚀

快速入门示例

安装后,您可以使用以下代码将可读的 gzip 文件流管道输入到解压缩器中,该解压缩器为每个单独的日志文件块发出解压缩数据事件

$stream = new React\Stream\ReadableResourceStream(fopen('access.log.gz', 'r'));

$decompressor = new Clue\React\Zlib\Decompressor(ZLIB_ENCODING_GZIP);
$stream->pipe($decompressor);

$decompressor->on('data', function ($data) {
    echo $data; // chunk of decompressed log data
});

请参阅示例

格式

此库是围绕底层 zlib 库的轻量级包装器。zlib 库提供多种不同的格式(有时被称为 编码),如下所述。

GZIP 格式

此库支持在RFC 1952中定义的 GZIP 压缩格式。这是更常见的压缩格式之一,并被用于多个地方

  • PHP: ZLIB_ENCODING_GZIP(仅 PHP 5.4+)
  • PHP: gzdecode()(仅 PHP 5.4+)和 gzencode()
  • 具有 .gz 文件扩展名的文件,例如 .tar.gz.tgz 归档(也称为“tarball”)
  • gzipgunzip(及其家族)命令行工具
  • 带有 Content-Encoding: gzip 头的 HTTP 压缩
  • Java: GZIPOutputStream

技术上,此格式使用原始 DEFLATE 压缩,并包含在 GZIP 头和尾中

10 bytes header (+ optional headers) + raw DEFLATE body + 8 bytes footer

原始 DEFLATE 格式

此库支持在RFC 1951中定义的原始 DEFLATE 压缩格式。DEFLATE 压缩算法返回我们所说的“原始 DEFLATE 格式”。这种原始 DEFLATE 格式通常被包裹在容器格式中,而不是直接使用

  • PHP: ZLIB_ENCODING_RAW(仅 PHP 5.4+)
  • PHP: gzdeflate()gzinflate()
  • 包裹在 GZIP 格式
  • 包裹在 ZLIB 格式

注意:此格式与一些人所说的“deflate格式”或“deflate编码”不同。这些名称通常用于指代我们所说的ZLIB格式

ZLIB 格式

此库支持RFC 1950中定义的ZLIB压缩格式。此格式在流式环境中常用。

  • PHP: ZLIB_ENCODING_DEFLATE(仅限PHP 5.4+)
  • PHP: gzcompress()gzuncompress()
  • HTTP压缩,使用带有Content-Encoding: deflate头部的压缩
  • Java: DeflaterOutputStream
  • Qt的qCompress()qUncompress()使用带有未压缩长度前缀的ZLIB格式(作为UINT32BE)。

从技术上讲,此格式使用原始DEFLATE压缩,并包含ZLIB头部和尾部。

2 bytes header (+ optional headers) + raw DEFLATE body + 4 bytes footer

注意:此格式通常被称为“deflate格式”或“deflate编码”。本文档避免使用此名称,以避免与原始DEFLATE格式混淆。

使用方法

所有类都使用Clue\React\Zlib命名空间。

压缩器

Compressor类可以用来压缩数据流。

它实现了DuplexStreamInterface,并在其可写端接受未压缩数据,在其可读端输出压缩数据。

$encoding = ZLIB_ENCODING_GZIP; // or ZLIB_ENCODING_RAW or ZLIB_ENCODING_DEFLATE
$compressor = new Clue\React\Zlib\Compressor($encoding);

$compressor->on('data', function ($data) {
    echo $data; // compressed binary data chunk
});

$compressor->write($uncompressed); // write uncompressed data chunk

这在管道环境中尤其有用。

$input->pipe($filterBadWords)->pipe($compressor)->pipe($output);

有关详细信息,请参阅ReactPHP的DuplexStreamInterface

解压缩器

Decompressor类可以用来解压缩数据流。

它实现了DuplexStreamInterface,并在其可写端接受压缩数据,在其可读端输出解压缩数据。

$encoding = ZLIB_ENCODING_GZIP; // or ZLIB_ENCODING_RAW or ZLIB_ENCODING_DEFLATE
$decompressor = new Clue\React\Zlib\Decompressor($encoding);

$decompressor->on('data', function ($data) {
    echo $data; // decompressed data chunk
});

$decompressor->write($compressed); // write compressed binary data chunk

这在管道环境中尤其有用。

$input->pipe($decompressor)->pipe($filterBadWords)->pipe($output);

有关详细信息,请参阅ReactPHP的DuplexStreamInterface

安装

安装此库的推荐方法是通过Composer你是Composer的新手吗?

本项目遵循SemVer。这将安装最新支持版本。

composer require clue/zlib-react:^1.2

有关版本升级的详细信息,请参阅变更日志

本项目旨在在所有平台上运行,因此除了ext-zlib之外,不要求安装任何PHP扩展。它支持在PHP 7至当前PHP 8+上运行。强烈建议使用此项目支持的最新PHP版本

需要ext-zlib扩展来处理底层的数据压缩和解压缩。此扩展作为许多PHP发行版的一部分默认安装,例如,它随Debian/Ubuntu基于PHP的安装和基于Windows的构建一起提供。如果您是从源代码构建PHP,您可能需要手动启用它。

我们致力于为旧配置提供平滑的升级路径。如果您需要支持旧版PHP版本和旧版HHVM,您可能需要查看旧的v0.2.x发布分支。此旧版发布分支还提供了一个安装候选者,在安装过程中不需要ext-zlib,而是使用运行时检查。在这种情况下,您可以像这样安装此项目

composer require "clue/zlib-react:^1.0||^0.2.2"

测试

要运行测试套件,您首先需要克隆此仓库,然后通过Composer安装所有依赖项

composer install

要运行测试套件,请前往项目根目录并执行

vendor/bin/phpunit

许可证

本项目采用宽松的MIT许可证发布。

你知道吗?我提供定制开发服务,并为发布和贡献发放发票。如需详细了解,请联系我(@clue)。

更多

  • 如果您想了解更多关于处理数据流的信息,请参阅底层react/stream组件的文档。

  • 如果您想处理压缩的tar包(.tar.gz.tgz文件扩展名),您可能需要在解压缩的流上使用clue/reactphp-tar