由于查找文件末尾之后不被视为错误,我怀疑“while (gzseek ($fh, $eof) == 0) $eof += $d;” 会进入无限循环。
(PHP 4, PHP 5, PHP 7, PHP 8)
gzseek — 在gz文件指针上查找
将给定文件指针的文件位置指示器设置为文件流中给定偏移量字节。 等效于调用(在C中)gzseek(zp, offset, SEEK_SET)
。
如果文件以只读方式打开,则模拟此函数,但这可能非常慢。如果文件以写入方式打开,则仅支持向前查找;gzseek() 然后将一系列零压缩到新的起始位置。
成功时返回0;否则返回-1。请注意,查找超过文件结尾不被认为是错误。
示例 #1 gzseek() 示例
<?php
$gz = gzopen('somefile.gz', 'r');
gzseek($gz,2);
echo gzgetc($gz);
gzclose($gz);
?>
由于查找文件末尾之后不被视为错误,我怀疑“while (gzseek ($fh, $eof) == 0) $eof += $d;” 会进入无限循环。
PHP/4.3.9
与注释相反,如果我尝试查找文件末尾之后,gzseek() 返回 -1。这是一个返回最后一个可查找位置并将文件指针放在那里的函数。
/** 将文件指针设置为文件末尾
* 并返回文件中的字节数。
*/
function gzend($fh)
{
$d = 1<<14;
$eof = $d;
while ( gzseek($fh, $eof) == 0 ) $eof += $d;
while ( $d > 1 )
{
$d >>= 1;
$eof += $d * (gzseek($fh, $eof)? -1 : 1);
}
return $eof;
}