在Php中读取文件时如何节省内存?

coo*_*aba 7 php memory file line

我有一个200kb的文件,我在多个页面中使用的,但在每个页面上我只需要1-2行该文件,所以如果我知道行号,我只能读取这些行所需的内容?

例如,如果我只需要第10行,我不想在内存中加载所有行,只是第10行.

对不起,我的英语不好!

Gor*_*don 19

试试SplFileObject

echo memory_get_usage(), PHP_EOL;        // 333200

$file = new SplFileObject('bible.txt');  // 996kb
$file->seek(5000);                       // jump to line 5000 (zero-based)
echo $file->current(), PHP_EOL;          // output current line 

echo memory_get_usage(), PHP_EOL;        // 342984 vs 3319864 when using file()
Run Code Online (Sandbox Code Playgroud)

要输出当前行,您可以使用current()或仅使用echo $file.我觉得使用这种方法更清楚.你也可以使用fgets(),但这将获得下一行.

当然,你只需要中间三行.我添加了memory_get_usage调用只是为了证明这种方法确实几乎没有记忆.

  • 请注意,`seek`-ed的行号不是5,000行.`$ line_pos`参数从零开始,因此该示例寻求在文本编辑器等中看到的行号5,001. (3认同)

Yac*_*oby 3

除非您知道该行的偏移量,否则您将需要读取该点之前的每一行。您可以通过使用类似fgets(). (编辑:fgets()我建议使用@Gordon解决方案,而不是)

可能更好的解决方案是使用数据库,因为数据库引擎将完成存储字符串的繁重工作,并允许您(非常有效地)获取某个“行”(它不是一行,而是一条带有一个数字 ID,但它相当于同一件事),而不必读取它之前的记录。

  • 他从未说过数据库会更快。只是这样会更好。OP 的担忧可以被视为内存问题而不是速度问题。 (2认同)