如何在写入过程中检测到Gzip和Bzip2文件的溢出?

时间:2017-10-27 11:33:29

标签: php streaming gzip bzip2

我需要确定文件在写入时超过指定的大小。 当我达到指定的大小时,我必须停止写作并抛出异常。

普通文件的示例:

$handle = fopen($filename, 'wb');
while (true) {
    // its work
    if (fstat($handle)['size'] + strlen($string) > BYTE_LIMIT) {
        throw SizeOverflowException::withLimit(BYTE_LIMIT);
    }

    fwrite($this->handle, $string);
}
fclose($handle);

或者我可以独立计算使用的字节

$handle = fopen($filename, 'wb');
$used_bytes = 0;
while (true) {
    if ($used_bytes + strlen($string) > BYTE_LIMIT) {
        throw SizeOverflowException::withLimit(BYTE_LIMIT);
    }

    fwrite($this->handle, $string);
    $used_bytes += strlen($string);
}
fclose($handle);

示例写Gzip:

$handle = gzopen($filename, 'wb9');
while (true) {
    // not work
    // fstat($handle) === false
    //if (fstat($handle)['size'] + strlen($string) > BYTE_LIMIT) {
    //    throw SizeOverflowException::withLimit(BYTE_LIMIT);
    //}

    gzwrite($this->handle, $string);
}
gzclose($handle);

与Bzip2类似:

$handle = bzopen($filename, 'w');
while (true) {
    // not work
    // fstat($handle) === false
    //if (fstat($handle)['size'] + strlen($string) > BYTE_LIMIT) {
    //    throw SizeOverflowException::withLimit(BYTE_LIMIT);
    //}

    bzwrite($this->handle, $string);
}
bzclose($handle);

我理解为什么fstat()在这种情况下不起作用,但我该如何解决这个问题呢?

现在我只能计算在未压缩模式下使用的字节数。

1 个答案:

答案 0 :(得分:1)

您可以使用deflate_initdeflate_add使用编码ZLIB_ENCODING_GZIP在内存中逐步压缩,并使用fwrite正常写入压缩数据。然后,您可以计算写入的压缩字节数,并以指定的大小停止。