php生成器快的原理,PHP性能优化利器:生成器 yield理解

以前最早写Python的时候对生成器这个内存性能优化的写法不陌生,但是但多PHPer或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5版本引入的功能,也可以是生成器作用不是很明显。但是,生成器功能的确非常有用。

最近在写csv导入导出,需要处理大量的数据,想到了PHP的生成器,写个总结吧

优点

生成器有哪些优点,如下:

生成器会对PHP应用的性能有非常大的影响

PHP代码运行时节省大量的内存

比较适合计算大量的数据

概念引入

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

function rangeNum($num){

$data = [];

for($i=0;$i

$data[] = time();

}

return $data;

}

复制代码

这是一个非常简单的PHP函数,我们在处理一些数组逻辑的时候经常会使用。这里的代码也非常简单。

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

$data = rangeNum(10);

foreach($data as $value){

sleep(1);

echo $value.'
';

}

复制代码

这里非常完美,没有任何问题。

思考:

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

创建生成器

我们直接修改函数

function rangeNum($num){

for($i=0;$i

yield time();

}

}

复制代码

使用生成器

$data = rangeNum(10);

foreach($data as $value){

sleep(1);

echo $value.'
';

}

复制代码

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

概念理解

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

实际开发应用

读取超大文件

PHP开发很多时候都要读取大文件,比如csv文件、excel文件,或者一些log文件。这些文件如果很大很大,比如20个G。这时,直接一次性把所有的内容读取到内存中进行处理不太现实。

百万级别的访问量

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

文章结尾

文章均为原创手写,如有错误希望指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值