PHP Generator 生成器

生成器

什么是生成器?官方的解释是:一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。简单的说就是在foreach循环的时候,最大限度的减少内存的开销。
Python中也有generator,作用是一样的,只不过PHP从5.5版本才引入。

场景描述

项目中需要将大批量的特殊用户进行状态修改。最初是考虑MySQL直接批量修改的,但是无奈没有写出可用的SQL,所以想到用PHP来处理。(后续还是使用了SQL的方式处理用户,等下一篇讲高效的MySQL是如何处理的。)

实践

简单的思路是,按条件将所有要修改的用户查出来,然后遍历一个个Update。(我知道这个是有点渣的写法=。=!)通过生成器去执行,减少内存的暂用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 处理方法
*/
public function dealWithOldData()
{
$userInfo = $oldUser->selectOldUser();
// 把处理过的数据id写如文件,用作记录
$fp = fopen('app.log','a');
foreach ($this->setStatus($userInfo) as $value)
{
fwrite($fp,$value.',');
}
fclose($fp);
exit('The End of Execute!');
}
/**
* 处理状态
* @param array $arg
* @return Generator
*/
private function setStatus(array $arg)
{
foreach ($arg as $item) {
yield $data->updateData($item['id'],['status'=>3]);
}
}

上万条数据很快处理完成,内存几乎没有多少飙升。

下一篇介绍一下,正确的使用SQL语句的处理方法。

坚持原创技术分享,您的支持将是鼓励我继续创作的动力!