php内存优化之yield大文件读取

php-yield 生成器 是 php5.5.5 之后的产物,它有以下的特点:


* 可以优化php的性能

* 节省大量的内存

* 适合大量数据计算


因为以前写过一个读取大文件行号的函数,我就试着想用yield重构下


  1. /**
  2. * 获取指定行内容
  3. * @param $file 文件路径
  4. * @param $line 行数
  5. * @param $length 指定行返回内容长度
  6. */
  7. function GetLine($file, $line, $length = 1024)
  8. {
  9.    $returnTxt = null;
  10.    // 初始化返回
  11.    $i = 1;
  12.    // 行数
  13.    $handle = @fopen($file, "r");
  14.    if ($handle) {
  15.        while (!feof($handle)) {
  16.            $buffer = fgets($handle, $length);
  17.            if ($line == $i) {
  18.                $returnTxt = $buffer;
  19.            }
  20.            $i++;
  21.        }
  22.        fclose($handle);
  23.    }
  24.    return $returnTxt;  
  25. }
  26. echo GetLine($file, 5000);

这种是以前的做法,改成yield之后如下:

  1. function GetLine2($file, $line, $length = 1024)
  2. {
  3.    $returnTxt = null;
  4.    $i = 1;
  5.    $handle = fopen($file, "r");
  6.    if ($handle) {
  7.        while (feof($handle)===false) {
  8.            $buffer = fgets($handle, $length);
  9.            if ($line == $i) {
  10.                yield $buffer;
  11.            }
  12.            $i++;
  13.        }
  14.        fclose($handle);
  15.    }
  16. }
  17. foreach (GetLine2($file,5000) as $key => $value) {
  18.    echo $value.PHP_EOL;
  19. }

分别测试了下单独运行下这两个函数的执行时间:



执行时间看不出什么,差不多。


我们在来测试下使用的内存:



可以看到非常省内存,这只是一个函数而已,如果都能将php中类似的功能全都换成生成器来优化下,节省的内存还是非常可观的。


1 条评论
gravatar头像