zoukankan      html  css  js  c++  java
  • Laravel中chunk组块结果集处理

    如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令。chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用 chunk 方法能够在处理大量数据集合时能够有效减少内存消耗:

    Flight::chunk(200, function ($flights) {
        foreach ($flights as $flight) {
            //
        }
    });
            $all_ark=Arkvolume::chunk(50000, function ($flights) {
                foreach ($flights as $flight) {
                   $GLOBALS['something'][] = $flight['id'];
                }
            });
    
            var_dump($GLOBALS['something'] );exit;
    

      这段代码是执行一个100条的数据进行更新,当执行完成后继续后面的另一百条数据……
    也就是说他每次操作的是一个数据块而不是整个数据库。

    需要注意的是:当使用带筛选的条件的chunk时,如果是自更新,那么你会漏掉一些数据,接着看代码:

    User::where('approved', 0)->chunk(100, function ($users) {
      foreach ($users as $user) {
        $user->update(['approved' => 1]);
      }
    });
    

      

    如果要运行上面的代码,并不会有报错,但是where条件是筛选approved0user然后将approved的值跟新为1
    在这个过程中,档第一数据库的数据被修改后,下一个数据块的数据将是在被修改后的数据中选出来的,这个时候数据变了,而page也加了1。所以执行结束后,只对数据中一半的数据进行了更新操作。

    如果没有明白的话,我们来看一下chunk的底层实现。还以上面的代码为例,假如一共有400条数据,数据被按照100条进行分块处理。
    page = 1: 最开始的时候page为1,选取1-100条数据进行处理;
    page = 2: 这时候前一百数据的approved值全部为1,那么在次筛选的时候数据将从第101条开始,而这个时候的page=2,那么处理的数据将是第200-300之前的数据
    之后依旧。

    public function chunk($count, callable $callback)
    {
        $results = $this->forPage($page = 1, $count)->get();
    
        while (count($results) > 0) {
            // On each chunk result set, we will pass them to the callback and then let the
            // developer take care of everything within the callback, which allows us to
            // keep the memory low for spinning through large result sets for working.
            if (call_user_func($callback, $results) === false) {
                return false;
            }
    
            $page++;
    
            $results = $this->forPage($page, $count)->get();
        }
    
        return true;
    }
    

      



  • 相关阅读:
    nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景
    进程和线程的定义和区别
    PHP中的 抽象类(abstract class)和 接口(interface)
    简单理解php的socket编程
    session跨域共享解决方案
    MySQL 对于千万级的大表要怎么优化
    关于存session,cookie还是数据库或者memcache的优劣,部分网上抄录
    MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引
    MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题
    PHP + NGINX 控制视频文件播放,并防止文件下载
  • 原文地址:https://www.cnblogs.com/blog-dyn/p/7396592.html
Copyright © 2011-2022 走看看