使用 yield 减少内存消耗

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');

 

posted @ 2019-03-17 22:51  佚名000  阅读(559)  评论(0编辑  收藏  举报