WithCoderWithCoderWithCoder

PHP生成器yield应用之读取超大文件

    在“PHP生成器yield介绍”这篇文章中,我们介绍了yield生成器的概念和基本用法。本文介绍如何使用生成器读取大文件。

    PHP在使用生成器的时候,会返回一个 Generator 类的对象。可以使用 foreach 对该对象进行迭代,每一次迭代,PHP会通过 Generator 实例计算出下一次需要迭代的值。

    PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。这时就可以使用生成器来解决这个问题。在打开文件后,使用生成器读取文件,每次读取一行,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。

    1. 打开文件,使用生成器读取文件,每次一行   

function readFileTxt()
{
   // fopen文件
   $handle = fopen("test.txt", 'rb');

   // 文件是否
   while (feof($handle) === false) {
       // fgets数读取文件一行
       yield fgets($handle); // 使用生成器返回
   }

   // 关闭文件
   fclose($handle);
}

    2. 使用 foreach 迭代对象

function readFile()
{
   $fg = $this->readFileTxt();
   foreach ($fg as $key => $value) {
       echo $value . '<br>';
   }
}

    假设文件有10行,以上代码输出如下:

    1-200422233602610.png

    当然,本文只是对使用yield生成器读取文件做简单的原理介绍,更复杂的实现可根据实际情况进行处理。

欢迎分享交流,转载请注明出处:WithCoder » PHP生成器yield应用之读取超大文件