reactphp-zlib
所属分类:压缩解压
开发工具:PHP
文件大小:0KB
下载次数:0
上传日期:2022-05-17 14:32:57
上 传 者:
sh-1993
说明: ReactPHP的流式zlib压缩器和解压缩器,支持GZIP、zlib和原始DEFLATE格式的压缩和解压缩。,
(Streaming zlib compressor and decompressor for ReactPHP, supporting compression and decompression of GZIP, ZLIB and raw DEFLATE formats.,)
文件列表:
CHANGELOG.md (3104, 2023-08-04)
LICENSE (1082, 2023-08-04)
composer.json (962, 2023-08-04)
src/ (0, 2023-08-04)
src/Compressor.php (2614, 2023-08-04)
src/Decompressor.php (3306, 2023-08-04)
src/TransformStream.php (3830, 2023-08-04)
# clue/reactphp-zlib
[![CI status](https://github.com/clue/reactphp-zlib/actions/workflows/ci.yml/badge.svg)](https://github.com/clue/reactphp-zlib/actions)
[![installs on Packagist](https://img.shields.io/packagist/dt/clue/zlib-react?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/clue/zlib-react)
Streaming zlib compressor and decompressor for [ReactPHP](https://reactphp.org/),
supporting compression and decompression of GZIP, ZLIB and raw DEFLATE formats.
**Table of contents**
* [Support us](#support-us)
* [Quickstart example](#quickstart-example)
* [Formats](#formats)
* [GZIP format](#gzip-format)
* [Raw DEFLATE format](#raw-deflate-format)
* [ZLIB format](#zlib-format)
* [Usage](#usage)
* [Compressor](#compressor)
* [Decompressor](#decompressor)
* [Install](#install)
* [Tests](#tests)
* [License](#license)
* [More](#more)
## Support us
We invest a lot of time developing, maintaining and updating our awesome
open-source projects. You can help us sustain this high-quality of our work by
[becoming a sponsor on GitHub](https://github.com/sponsors/clue). Sponsors get
numerous benefits in return, see our [sponsoring page](https://github.com/sponsors/clue)
for details.
Let's take these projects to the next level together!
## Quickstart example
Once [installed](#install), you can use the following code to pipe a readable
gzip file stream into an decompressor which emits decompressed data events for
each individual log file chunk:
```php
$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
});
```
See also the [examples](examples).
## Formats
This library is a lightweight wrapper around the underlying zlib library.
The zlib library offers a number of different formats (sometimes referred to as *encodings*) detailed below.
### GZIP format
This library supports the GZIP compression format as defined in [RFC 1952](https://tools.ietf.org/html/rfc1952).
This is one of the more common compression formats and is used in several places:
* PHP: `ZLIB_ENCODING_GZIP` (PHP 5.4+ only)
* PHP: `gzdecode()` (PHP 5.4+ only) and `gzencode()`
* Files with `.gz` file extension, e.g. `.tar.gz` or `.tgz` archives (also known as "tarballs")
* `gzip` and `gunzip` (and family) command line tools
* [HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression) with `Content-Encoding: gzip` header
* Java: `GZIPOutputStream`
Technically, this format uses [raw DEFLATE compression](#raw-deflate-format) wrapped in a GZIP header and footer:
```
10 bytes header (+ optional headers) + raw DEFLATE body + 8 bytes footer
```
### Raw DEFLATE format
This library supports the raw DEFLATE compression format as defined in [RFC 1951](https://tools.ietf.org/html/rfc1951).
The DEFLATE compression algorithm returns what we refer to as "raw DEFLATE format".
This raw DEFLATE format is commonly wrapped in container formats instead of being used directly:
* PHP: `ZLIB_ENCODING_RAW` (PHP 5.4+ only)
* PHP: `gzdeflate()` and `gzinflate()`
* Wrapped in [GZIP format](#gzip-format)
* Wrapped in [ZLIB format](#zlib-format)
> Note: This format is not to be confused with what some people call "deflate format" or "deflate encoding".
These names are commonly used to refer to what we call [ZLIB format](#zlib-format).
### ZLIB format
This library supports the ZLIB compression format as defined in [RFC 1950](https://tools.ietf.org/html/rfc1950).
This format is commonly used in a streaming context:
* PHP: `ZLIB_ENCODING_DEFLATE` (PHP 5.4+ only)
* PHP: `gzcompress()` and `gzuncompress()`
* [HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression) with `Content-Encoding: deflate` header
* Java: `DeflaterOutputStream`
* Qt's [`qCompress()`](https://doc.qt.io/archives/qt-4.8/qbytearray.html#qCompress)
and [`qUncompress()`](https://doc.qt.io/archives/qt-4.8/qbytearray.html#qUncompress)
uses the ZLIB format prefixed with the uncompressed length (as `UINT32BE`).
Technically, this format uses [raw DEFLATE compression](#raw-deflate-format) wrapped in a ZLIB header and footer:
```
2 bytes header (+ optional headers) + raw DEFLATE body + 4 bytes footer
```
> Note: This format is often referred to as the "deflate format" or "deflate encoding".
This documentation avoids this name in order to avoid confusion with the [raw DEFLATE format](#raw-deflate-format).
## Usage
All classes use the `Clue\React\Zlib` namespace.
### Compressor
The `Compressor` class can be used to compress a stream of data.
It implements the [`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface)
and accepts uncompressed data on its writable side and emits compressed data
on its readable side.
```php
$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
```
This is particularly useful in a piping context:
```php
$input->pipe($filterBadWords)->pipe($compressor)->pipe($output);
```
For more details, see ReactPHP's
[`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface).
### Decompressor
The `Decompressor` class can be used to decompress a stream of data.
It implements the [`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface)
and accepts compressed data on its writable side and emits decompressed data
on its readable side.
```php
$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
```
This is particularly useful in a piping context:
```php
$input->pipe($decompressor)->pipe($filterBadWords)->pipe($output);
```
For more details, see ReactPHP's
[`DuplexStreamInterface`](https://github.com/reactphp/stream#duplexstreaminterface).
## Install
The recommended way to install this library is [through Composer](https://getcomposer.org/).
[New to Composer?](https://getcomposer.org/doc/00-intro.md)
This project follows [SemVer](https://semver.org/).
This will install the latest supported version:
```bash
composer require clue/zlib-react:^1.2
```
See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades.
This project aims to run on any platform and thus does not require any PHP
extensions besides `ext-zlib` and supports running on PHP 7 through current PHP 8+.
It's *highly recommended to use the latest supported PHP version* for this project.
The `ext-zlib` extension is required for handling the underlying data compression
and decompression.
This extension is already installed as part of many PHP distributions out-of-the-box,
e.g. it ships with Debian/Ubuntu-based PHP installations and Windows-based
builds by default. If you're building PHP from source, you may have to
[manually enable](https://www.php.net/manual/en/zlib.installation.php) it.
We're committed to providing a smooth upgrade path for legacy setups.
If you need to support legacy PHP versions and legacy HHVM, you may want to
check out the legacy `v0.2.x` release branch.
This legacy release branch also provides an installation candidate that does not
require `ext-zlib` during installation but uses runtime checks instead.
In this case, you can install this project like this:
```bash
composer require "clue/zlib-react:^1.0||^0.2.2"
```
## Tests
To run the test suite, you first need to clone this repo and then install all
dependencies [through Composer](https://getcomposer.org/):
```bash
composer install
```
To run the test suite, go to the project root and run:
```bash
vendor/bin/phpunit
```
## License
This project is released under the permissive [MIT license](LICENSE).
> Did you know that I offer custom development services and issuing invoices for
sponsorships of releases and for contributions? Contact me (@clue) for details.
## More
* If you want to learn more about processing streams of data, refer to the documentation of
the underlying [react/stream](https://github.com/reactphp/stream) component.
* If you want to process compressed tarballs (`.tar.gz` and `.tgz` file extension), you may
want to use [clue/reactphp-tar](https://github.com/clue/reactphp-tar) on the decompressed stream.
近期下载者:
相关文件:
收藏者: