xp-forge / compression
为 XP 框架提供压缩 I/O 功能
v1.2.0
2024-03-24 14:13 UTC
Requires
- php: >=7.0.0
- xp-framework/core: ^12.0 | ^11.0 | ^10.0
Requires (Dev)
- xp-framework/test: ^2.0 | ^1.0
README
压缩输出流和解压缩输入流,包括 GZip、BZip2 和 Brotli。
示例
读取 GZIP 压缩文件
use io\streams\FileInputStream; use io\streams\compress\GzipInputStream; $in= new GzipInputStream(new FileInputStream('message.txt.gz')); while ($in->available()) { echo $in->read(); } $in->close();
写入文件,使用 BZIP2 在线压缩数据
use io\streams\FileOutputStream; use io\streams\compress\Bzip2OutputStream; $out= new Bzip2OutputStream(new FileOutputStream('message.txt.bz2')); $out->write('Hello World!'); $out->write("\n"); $out->close();
依赖项
压缩算法是用 C 实现的,因此需要特定的 PHP 扩展
- GZip - 需要 PHP 的 "zlib" 扩展
- Bzip2 - 需要 PHP 的 "bzip2" 扩展
- Brotli - 需要 https://github.com/kjdev/php-ext-brotli
可以通过 Compression
API 访问这些算法
use io\streams\{Compression, FileInputStream, FileOutputStream}; // Returns an algorithm instance. Raises a lang.MethodNotImplementedException // if the required "bzip2" extension is not loaded $compressed= Compression::named('bzip2'); // Read $bytes= ''; $in= $compressed->open(new FileInputStream($file)); while ($in->available()) { $bytes.= $in->read(); } $in->close(); // Write using strongest compression (other predefined values are FASTEST // and DEFAULT; alternatively, the level can be passed directly). $out= $compressed->create(new FileOutputStream($file), Compression::STRONGEST); $out->write($bytes); $out->close();
可以使用 Compression
API 来发现支持的算法
use io\streams\Compression; echo "Supported algorithms:\n"; foreach (Compression::algorithms()->supported() as $compression) { echo '✓ ', $compression->name(), "\n"; }
...或者作为一条单行 shell 命令
$ xp -w '\io\streams\Compression::algorithms()'
io.streams.compress.Algorithms@{
io.streams.compress.Gzip(token: gzip, extension: .gz, supported: true, levels: 1..9)
io.streams.compress.Bzip2(token: bzip2, extension: .bz2, supported: false, levels: 1..9)
io.streams.compress.Brotli(token: br, extension: .br, supported: true, levels: 1..11)
}
高级示例
使用 HTTP Accept-Encoding 和 Content-Encoding 获取给定的 URL
use io\streams\Compression; use peer\http\HttpConnection; // Compile list of supported compression algorithms, e.g. "gzip, br" $accept= Compression::algorithms()->accept(); echo "== Sending {$accept} ==\n"; // Make request, sending supported content encodings via Accept-Encoding $conn= new HttpConnection($argv[1]); $res= $conn->get(null, ['Accept-Encoding' => $accept]); // Handle Content-Encoding header if ($encoding= $res->header('Content-Encoding')) { $compression= Compression::named($encoding[0]); echo "== Using ", $compression->name(), " ==\n"; $in= $compression->open($res->in()); } else { echo "== Uncompressed ==\n"; $in= $res->in(); } // Write contents to output while ($in->available()) { echo $in->read(); } $in->close();