由於搜尋超過檔案結尾不被視為錯誤,我懷疑 "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;
}