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