如何使用 PHP 读取大 gz 文件的一部分

How to read portions of a big gz file with PHP

我需要读取一个大的 txt 文件(超过 1GB)以提取其中的多个字符串。使用 gzread,我能够从头读取到一定数量的 kb(比如说 1000000)。但是我怎样才能读取文件的下一个 1000000kb? 有没有办法从一个点开始,从那里读取1000000kb,直到文件没有读完?

$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
$readfile = gzread($zd,1000000); 
$first_array = explode("IT\",$readfile);
unset($first_array[0]);
foreach($first_array as $row){
  $full_id = explode(" ",$full_id);
  echo $full_id[0];
  echo "<br>";
}
gzclose($zd);

更新;在没有 while 循环的情况下获得特定部分

$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
fseek($zd, 1000000); # jump to a new position here 
$readfile = gzread($zd,1000000);
//...process $readfile 
gzclose($zd);

例子

一个文本文件(test.txt)

给出的是以下文本文件:

12345678

Gzip 压缩

Gzip 文本文件:

gzip test.txt

创建了一个新文件:test.txt.gz

演示

function getGzFileChunk(string $filename, int $start, int $end) 
{
    $zd = gzopen($filename, "r");
    fseek($zd, $start);
    $readfile = gzread($zd, $end);
    gzclose($zd);
    return $readfile;
}

var_dump(getGzFileChunk("test.txt.gz", 3, 2)); //output: 45
var_dump(getGzFileChunk("test.txt.gz", 1, 2)); //output: 23
var_dump(getGzFileChunk("test.txt.gz", 4, 2)); //output: 56
var_dump(getGzFileChunk("test.txt.gz", 6, 2)); //output: 78
var_dump(getGzFileChunk("test.txt.gz", 2, 2)); //output: 34

旧答案

gzread 放在 while 循环中,如下所示:

<?php

$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
while($readfile = gzread($zd,1000000)) {
    //...your process
}
gzclose($zd);

如果您的意思是:您可以在不读取 gzip 文件的前一百万字节的情况下开始读取第二百万字节,那么答案是否定的。您不能随机访问 gzip 文件。