php 里面想要处理一个文本文件,有一个方法是使用 file() 函数,但是这个函数会读取文件所有内容,可能会导致占用很大内存。

// 28.1 M 的文本文件, 200w 行
$file = 'storage/logs/runningtime/2019-03-17.log';

$file = file($file);

// 219.28M
dd(round(memory_get_usage() / 1024 / 1024, 2) . 'M');

 

但是我们可以以另外一种方式处理,使用 fgets 逐行读取,逐行处理。

// 28.1 M 的文本文件, 200w 行
$file = 'storage/logs/runningtime/2019-03-17.log';

$fp = fopen($file, 'r');
while (($line = fgets($fp)) !== false) {
    // do something
}

// 1.87M
dd(round(memory_get_usage() / 1024 / 1024, 2) . 'M');

 

现在,我们也有另外一种选择,使用 yield 关键字,用法如下:

// 28.1 M 的文本文件, 200w 行
$file = 'storage/logs/runningtime/2019-03-17.log';

function generator($file)
{
    $fp = fopen($file, 'r');
    while (($line = fgets($fp)) !== false) {
        yield $line;
    }
    fclose($fp);
}

foreach (generator($file) as $line) {
    // do something
}

// 1.86M
dd(round(memory_get_usage() / 1024 / 1024, 2) . 'M');

 

相关文章:

  • 2022-12-23
  • 2021-09-12
  • 2021-10-07
  • 2022-01-11
  • 2022-02-10
  • 2021-05-22
  • 2021-07-20
猜你喜欢
  • 2021-06-06
  • 2021-04-25
  • 2022-12-23
  • 2021-05-27
  • 2021-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案