关于 PHP 迭代生成器

什么是迭代生成器, 这个在这里就不多讲了,因为 PHP 核心开发者之一的鸟哥已经写了一篇不错的解释文章:

在 PHP 中使用协程实现多任务调度

这里就不再多说基础理论,只记录一个经典的迭代生成器应用场景。

场景

平时用 PHP 处理数据的时间,经常用 ORM 查询一批数据来处理, 类似:

Users::all();

如果 Users 表里的数据量小还好, 但是,如果很大的话很容易造成内存溢出。

那怎么样优雅高效的实现功能呢?答案就是迭代生成器。

改进方案

<?PHP

class A {
    protected function getUsers($count){
        for ($i = 1; $i <= $count; $i++){
            yield Users::where('id', $i)->first();
        }
    }
    
    public function dealUser(){
        $count = Users::count()
        foreach ($this->getUsers($count) as $value){
            $value->username;
            // other code ....   
        }
    }
}

因为迭代生成器的特性, 一次只加载了 1 条数据,完美的解决了内存溢出的问题,并且代码改动量非常小。

tip:
这样处理会增加数据库的查询链接时间(因为每次都查 1 条数据),是典型的时间换空间的案例。

总结

上面只是一个简单的例子,希望可以抛砖引玉,应用到更多的场景。

另外, PHP 7 支持 迭代生成器委托 这个新特性 (见 7.0 新特性:生成器委托)。

最后修改:2019 年 07 月 05 日 05 : 26 PM
打赏不打超过你工资的一半!