3

我有一个 PHP 脚本,它适用于大型文本文件,主要是日志文件。问题是大多数时候我只想要它的一部分,从一个分裂点到另一个分裂点。但是必须读取 2GB 的文本文件才能获取其中的一小部分,这会减慢处理速度。

有什么方法可以只读取部分文本而不必将整个文件读入内存?

数据是这样存储的:

|18.05.2013: some log info here...
|19.05.2013: some log info here...
|20.05.2013: some log info here...
|21.05.2013: some log info here...
|22.05.2013: some log info here...
| etc...

因此,如果我只想要“19.05.2012”,我仍然需要阅读所有其他文本。有什么办法我只能阅读那部分吗?

PS 数据库不是一个选项,将文件拆分成更小的文件也是不切实际的。

4

1 回答 1

2

我认为您正在寻找fseek

但是,您需要以第 X 个字符是第 Y 个数据的开头的方式来格式化您的数据。实际上,如果每个日志都可以具有相同的长度,这可能是一种有效的方法。否则,您仍然需要阅读每一行来搜索它。

让我们想象一下(未经测试,但只是为了让你开始):

function getDataFromFile($fileName, $start, $length) {
    $f_handle = fopen($filename, 'r');
    fseek($f_handle, $start);
    $str = fgets($length);
    fclose($f_handle);
    return $str;
}

然后:

$fname='myfile.txt';
$DATA_LENGTH = 50;
$wanted_data = 12;

$data = getDataFromFile($fname, $DATA_LENGTH*$wanted_data, $DATA_LENGTH);

我希望这有帮助。

于 2013-05-24T18:23:54.713 回答