由于在结束之后查找不被视为错误,因此我怀疑 "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。请注意,查找超过 EOF 不被视为错误。
示例 #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;
}