Skip to content

Commit 9081c6a

Browse files
Merge pull request #5 from genkgo/single_gz_stream
use a single gz stream by encoding chunks
2 parents bddd7e1 + 92c40ad commit 9081c6a

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

src/TarGzReader.php

+23-6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public function __construct(TarReader $tarReader, int $level = -1)
3535
*/
3636
public function read(int $blockSize): \Generator
3737
{
38+
$deflateContext = \deflate_init(\ZLIB_ENCODING_GZIP, ['level' => $this->level]);
39+
if ($deflateContext === false) {
40+
throw new \UnexpectedValueException('Cannot open deflate context');
41+
}
42+
3843
$generator = $this->tarReader->read($blockSize);
3944
foreach ($generator as $stream) {
4045
while ($stream->eof() === false) {
@@ -43,16 +48,28 @@ public function read(int $blockSize): \Generator
4348
throw new \UnexpectedValueException('Failed to read tar stream');
4449
}
4550

46-
$encoded = \gzencode($data, $this->level);
47-
if (!$encoded) {
51+
$encoded = \deflate_add($deflateContext, $data, \ZLIB_NO_FLUSH);
52+
if ($encoded === false) {
4853
throw new \UnexpectedValueException('Failed to encode tar data');
4954
}
5055

51-
$stream = new \SplTempFileObject();
52-
$stream->fwrite($encoded);
53-
$stream->rewind();
54-
yield $stream;
56+
if ($encoded !== '') {
57+
$stream = new \SplTempFileObject();
58+
$stream->fwrite($encoded);
59+
$stream->rewind();
60+
yield $stream;
61+
}
5562
}
5663
}
64+
65+
$encoded = \deflate_add($deflateContext, '', \ZLIB_FINISH);
66+
if ($encoded === false) {
67+
throw new \UnexpectedValueException('Failed to encode last chunk of tar data');
68+
}
69+
70+
$stream = new \SplTempFileObject();
71+
$stream->fwrite($encoded);
72+
$stream->rewind();
73+
yield $stream;
5774
}
5875
}

0 commit comments

Comments
 (0)