ホームページ  >  記事  >  バックエンド開発  >  Laravelでのチャンクセット処理

Laravelでのチャンクセット処理

炎欲天舞
炎欲天舞オリジナル
2017-08-21 10:20:282376ブラウズ

何千もの 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 項目のデータ更新を実行します。百個のデータ...🎜つまり、彼はデータベース全体ではなく、毎回 1 つのデータ ブロックを操作します。 🎜🎜フィルタリング条件でチャンクを使用する場合、自己更新の場合、一部のデータが失われることに注意してください。 次に、コードを見てください: 🎜🎜🎜🎜rrreee🎜 上記のコードを実行したい場合は、それが実行されます。エラーは発生しますが、where 条件は、approved0 である user をフィルタリングすることです。 set approved の値は 1 に更新されます。 🎜この処理では、最初のデータベースのデータが変更された後、変更されたデータの中から次のデータブロックのデータが選択されます。この時点でデータは変更されており、ページも1つ増加しています。したがって、実行後はデータ内の半分のデータしか更新されていません。 🎜🎜理解できない場合は、チャンクの基礎となる実装を見てみましょう。上記のコードを例にすると、データが合計400個ある場合、データは100個ごとにブロックに分割されます。 🎜page = 1: 最初はページが 1 で、1 ~ 100 個のデータが処理のために選択されます。 🎜page = 2: この時点で、最初のページの 承認 値が選択されます。 100個のデータは全て1なので、次のフィルタリングでは101番目からデータが開始され、この時page=2であれば処理されるデータは200~300番目までのデータとなります。 。 🎜🎜🎜🎜りー

以上がLaravelでのチャンクセット処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。