PHP性能优化利器:生成器 yield理解

之前最先写Python的时候对生成器这个内存性能优化的写法不陌生,可是但多PHPer或许都不知道生成器这个功能,多是由于生成器是PHP 5.5版本引入的功能,也能够是生成器做用不是很明显。可是,生成器功能的确很是有用。 最近在写csv导入导出,须要处理大量的数据,想到了PHP的生成器,写个总结吧php

优势

生成器有哪些优势,以下:

  • 生成器会对PHP应用的性能有很是大的影响
  • PHP代码运行时节省大量的内存
  • 比较适合计算大量的数据

概念引入

首先,放下生成器概念的包袱,来看一个简单的PHP函数:数组

function rangeNum($num){
    $data = [];
    for($i=0;$i<$num;$i++){
        $data[] = time();
    }
    return $data;
}
复制代码

这是一个很是简单的PHP函数,咱们在处理一些数组逻辑的时候常常会使用。这里的代码也很是简单。性能优化

下面咱们再写一个函数去取出$data中的数据函数

$data = rangeNum(10);
foreach($data as $value){
    sleep(1);
    echo $value.'<br />';
}
复制代码

这里很是完美,没有任何问题。性能

思考:

咱们在调用函数时传递1000w或者更多的时候,那么调用函数的时候for循环1000w次$data里面的1000w条数据都是存储在内存当中的,在调用函数时候会占用大量内存优化

建立生成器

咱们直接修改函数spa

function rangeNum($num){
    for($i=0;$i<$num;$i++){
        yield time();
    }
}
复制代码

使用生成器

$data = rangeNum(10);
foreach($data as $value){
    sleep(1);
    echo $value.'<br />';
}
复制代码

到这里,你应该对生成器有点儿头绪。excel

概念理解

首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值code

实际开发应用

读取超大文件

PHP开发不少时候都要读取大文件,好比csv文件、excel文件,或者一些log文件。这些文件若是很大很大,好比20个G。这时,直接一次性把全部的内容读取到内存中进行处理不太现实。对象

百万级别的访问量

yield生成器是php5.5以后出现的,yield提供了一种更简单的方法来实现简单的迭代对象,相较于类实现 Iterator 接口的方式,性能开销和复杂性大大下降。

文章结尾

文章均为原创手写,若有错误但愿指出。

相关文章
相关标签/搜索