수천 개의 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
条件是筛选approved
为0
的user
然后将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; }
where
조건은 승인
이 0
인 사용자
를 필터링한 다음 approved
설정 > 값이 1
로 업데이트됩니다. 🎜이 과정에서 첫 번째 데이터베이스의 데이터가 수정된 후 수정된 데이터 중에서 다음 데이터 블록의 데이터가 선택되며, 이때 데이터가 변경되고 페이지도 1 증가됩니다. 따라서 실행 후에는 데이터의 절반만 업데이트되었습니다. 🎜🎜이해가 되지 않는다면, 청크의 기본 구현을 살펴보겠습니다. 위의 코드를 예로 들면, 전체 데이터가 400개라면 데이터는 100개 단위로 블록으로 나누어집니다. 🎜page = 1: 처음에는 페이지가 1이고, 1~100개의 데이터가 처리 대상으로 선택됩니다. 🎜page = 2: 이때 첫 번째의 승인
값입니다. 100개 데이터는 모두 1이고, 다음 필터링 시에는 101번째 항목부터 데이터가 시작되며, 이때 페이지=2인 경우 처리된 데이터는 200~300개 이전의 데이터가 되며 이후에도 동일하게 유지됩니다. 저것. 🎜🎜🎜🎜rreee위 내용은 Laravel에서 청크 세트 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!