美文网首页
PHP yield 读取大文件

PHP yield 读取大文件

作者: 程序员有话说 | 来源:发表于2020-10-13 09:27 被阅读0次
    优化下读取大文件,在 PHP 读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,今天采用  `yield` 来实现大文件的读取。
    
    • 传统方式
    function readLocalFile($fileName)
    {
      $handle = fopen($fileName, 'r');
      $lins = [];
      while (!feof($handle)) {
          $lines[] = fgets($handle);
      }
      fclose($handle);
      return $lines;
    }
    
    • 使用yield 特性读取文件
    function readYieldFile($fileName)
    {
      $handle = fopen($fileName, 'r');
      while (!feof($handle)) {
          yield fgets($handle);
      }
      fclose($handle);
    }
    
    • 辅助函数

    为了便于测试,我们写一个读取内存的辅助函数

    function formatBytes($bytes)
    {
      if ($bytes < 1024) {
          return $bytes . "b";
      } else if ($bytes < 1048576) {
          return round($bytes / 1024, 2) . "kb";
      }
      return round($bytes / 1048576, 2) . 'mb';
    }
    
    • 测试
    # 第一种
    readLocalFile('./test.txt');
    echo formatBytes(memory_get_peak_usage());  // 结果为 7.59mb
    
    # 第二种
    $lines = readYieldFile('./test.txt');
    foreach ($lines as $row) {}
    echo formatBytes(memory_get_peak_usage());  // 结果为 137.79kb
    
    

    相关文章

      网友评论

          本文标题:PHP yield 读取大文件

          本文链接:https://www.haomeiwen.com/subject/oogmpktx.html