Since seek after the end is not considered an error, I doubt that "while (gzseek ($fh, $eof) == 0) $eof += $d;" will get into infinite loop.(PHP 4, PHP 5, PHP 7, PHP 8)
gzseek — Positioniert den gz-Dateizeiger
   Setzt die Schreib-/Leseposition für die angegebene Datei.
   Dies entspricht dem C-API Aufruf
   gzseek(zp, offset, SEEK_SET).
  
Wenn die Datei für Lesezugriffe geöffnet ist, wird diese Funktion emuliert und kann sehr langsam sein. Wenn die Datei zum Schreiben geöffnet ist, kann nur vorwärts positioniert werden; die Funktion komprimiert dann eine Sequenz von Nullbytes, um die gewünschte Position zu erreichen.
streamDer gz-Dateizeiger. Dieser muss auf eine gültige, erfolgreich mit gzopen() geöffnete Datei zeigen.
offsetDie gewünschte Position.
whence
        whence gibt an, auf welche Anfangsposition sich
        offset bezieht. Mögliche Werte sind:
        
SEEK_SET - Setzt die Position auf offset Bytes vom Dataianfang.SEEK_CUR - Verschiebt die Position um offset Bytes ausgehend von der aktuellen Position.
        Wird whence nicht angegeben, so wird
        SEEK_SET angenommen.
       
Gibt 0 bei Erfolg und -1 bei Fehlern zurück. Beachten Sie, dass eine Suche über das Dateiende hinaus nicht als Fehler gilt.
Beispiel #1 gzseek()-Beispiel
<?php
$gz = gzopen('somefile.gz', 'r');
gzseek($gz,2);
echo gzgetc($gz);
gzclose($gz);
?>
Since seek after the end is not considered an error, I doubt that "while (gzseek ($fh, $eof) == 0) $eof += $d;" will get into infinite loop.PHP/4.3.9
contrary to the notes, gzseek() returns -1 if I try to seek past the end of the file.  here is a function that will return the last seekable position, and put the file pointer there.
/** sets the file pointer at the end of the file
 *  and returns the number of bytes in the file.
 */
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;
}