guest-one/php-tar-streamer

TarStreamer — 基于流的 tar 处理器

1.2.1 2023-08-30 16:35 UTC

This package is auto-updated.

Last update: 2024-09-30 01:29:59 UTC


README

这个库是为了解决以下问题而创建的

  • 在有限的 RAM 上处理非常大的(千兆字节)tar 归档。
  • 处理通过 unix 管道传入的归档。

用法

安装

composer require guest-one/php-tar-streamer

创建新的 .tar.gz

$out = gzopen("output.tar.gz", "wb9");
$tar = new \GO\Tar\TarStreamer($out);

// Adding existing empty folder as "some_dir"
$tar->addExistingFile("some_dir", "/tmp");

// Adding existing file as "some_dir/file.php"
$tar->addExistingFile("some_dir/file.php", __FILE__);

// Adding end-of-archive marker
$tar->addEndOfArchive();
fclose($out);

从 STDIN 提取 .tar.gz 并显示到 STDERR

$in  = gzopen("php://stdin", "rb");
$out = fopen("php://stderr", "wt");

$tar = new \GO\Tar\TarStreamer($in);

while (false !== $header = $tar->readHeader()) {
    fwrite($out, $header['pathname']. ":". PHP_EOL);
    $handle = $tar->getDataStream();
    while (!feof($handle)) {
        $data = fread($handle, 80);
        fwrite($out, "  ". base64_encode($data). PHP_EOL);
    }
}

与其他包比较

示例 中查看详细信息。

TL/DR: PharData 快速,但使用 RAM。TarStreamer 快速且节省 RAM。

$ ./run.sh

PEAR Tar test:
(pear/archive_tar)
PHP=7.4.28
      z10mb.bin in 81921 reads
     z100mb.bin in 819201 reads
      r10mb.bin in 81921 reads
     r100mb.bin in 819201 reads
time:   2.1175360679626
memory: 2097152

PharData test:
(builtin class)
PHP=7.4.28
     r100mb.bin in 819200 reads
      r10mb.bin in 81920 reads
     z100mb.bin in 819200 reads
      z10mb.bin in 81920 reads
time:   1.0884189605713
memory: 10485760

TarStreamer test:
(this package)
PHP=7.4.28
      z10mb.bin in 81920 reads
     z100mb.bin in 819200 reads
      r10mb.bin in 81920 reads
     r100mb.bin in 819200 reads
time:   0.97866702079773
memory: 2097152

Splitbrain PHPArchive\Tar test:
(splitbrain/php-archive)
PHP=7.4.28
      z10mb.bin in 81921 reads
     z100mb.bin in 819201 reads
      r10mb.bin in 81921 reads
     r100mb.bin in 819201 reads
time:   1.76238489151
memory: 2097152

限制

  • 支持的唯一 tar 版本是 "ustar"
  • 仅完全支持 "目录"、"文件" 和 "符号链接" 条目类型
  • 该包未在非 Linux 环境中得到适当测试