>  기사  >  백엔드 개발  >  Laravel에서 청크 세트 처리

Laravel에서 청크 세트 처리

炎欲天舞
炎欲天舞원래의
2017-08-21 10:20:282332검색

수천 개의 Eloquent 결과를 처리해야 하는 경우 chunk 명령을 사용할 수 있습니다. chunk 메소드는 Eloquent 모델의 "청크"를 가져와서 처리를 위해 주어진 클로저에 채웁니다. chunk 방법을 사용하면 대규모 데이터 세트를 처리할 때 메모리 소비를 효과적으로 줄일 수 있습니다. 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

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;
}

🎜rrreee🎜 이 코드는 실행이 완료되면 100개 항목의 데이터 업데이트를 실행합니다. 다른 코드를 계속 진행합니다. 수백 개의 데이터...🎜즉, 전체 데이터베이스가 아닌 매번 하나의 데이터 블록을 운영한다는 것입니다. 🎜🎜필터링 조건이 있는 청크를 사용할 때 자체 업데이트되는 경우 일부 데이터가 누락될 수 있다는 점에 유의해야 합니다. 그런 다음 코드를 살펴보세요. 🎜🎜🎜🎜rrreee🎜위 코드를 실행하려면 오류가 있지만 where 조건은 승인0사용자를 필터링한 다음 approved설정 > 값이 1로 업데이트됩니다. 🎜이 과정에서 첫 번째 데이터베이스의 데이터가 수정된 후 수정된 데이터 중에서 다음 데이터 블록의 데이터가 선택되며, 이때 데이터가 변경되고 페이지도 1 증가됩니다. 따라서 실행 후에는 데이터의 절반만 업데이트되었습니다. 🎜🎜이해가 되지 않는다면, 청크의 기본 구현을 살펴보겠습니다. 위의 코드를 예로 들면, 전체 데이터가 400개라면 데이터는 100개 단위로 블록으로 나누어집니다. 🎜page = 1: 처음에는 페이지가 1이고, 1~100개의 데이터가 처리 대상으로 선택됩니다. 🎜page = 2: 이때 첫 번째의 승인 값입니다. 100개 데이터는 모두 1이고, 다음 필터링 시에는 101번째 항목부터 데이터가 시작되며, 이때 페이지=2인 경우 처리된 데이터는 200~300개 이전의 데이터가 되며 이후에도 동일하게 유지됩니다. 저것. 🎜🎜🎜🎜rreee

위 내용은 Laravel에서 청크 세트 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.