ホームページ >PHPフレームワーク >Laravel >Lazy Collections を使用して Laravel Excel 読み取りのパフォーマンスを向上させる方法の詳細な説明 (数百万のデータを簡単にサポート)
Laravel 6: Lazy Collections に新しいタイプのコレクションが追加されました。これらは、メモリの制約に遭遇することなく非常に大規模なデータ セット (数千行または数百万行) を処理する必要がある場合に最適です。
推奨: laravel チュートリアル
私の最近のタスクは、仕事中のプロジェクトで Excel エクスポートをリファクタリングすることでした。問題は、データセットが大きすぎて Laravel で処理できないため、エクスポートを作成できなくなることです。データベース クエリでは約 300,000 件の結果が返されました。アプリケーションがタイムアウトするか、常にメモリ不足になります。
素朴なアプローチは、タイムアウトまたはメモリ制限を増やし、次回何か問題が発生したときに他の人が対処してくれることを期待することです。しかし、私の仕事はそうではありません。私はバンドエイドが好きではありません。私は具体的で長期的な解決策を好みます。
Laravel Excel 拡張パックはすでに非常に柔軟です。 FromQuery 懸念を使用するときに「チャンク」を使用することで、データベースの負荷を大幅に軽減します。ただし、エクスポートでは依然として大規模なデータセットに苦労しています。
同僚と私は、この機能を完全に書き直す必要があるかどうかについて議論しました。エクスポートをキューにプッシュし、エクスポートが完了したらユーザーに通知を送信します。ただし、この機能はこのアプリではほんの些細なことです。単純なエクスポートのためだけにこれほど多くのオーバーヘッドを追加するのは意味がありません。
その日の後半、Laravel に LazyCollections があることを思い出したので、ちょっとした「思いつき」の瞬間がありました。
エクスポートを書き直しました。FromQuery の代わりに FromCollection-concern を使用するようになりました。 collection() メソッドに加えなければならなかった唯一の変更は、クエリ ビルダー チェーンの最後にある get() メソッドをcursor() に置き換えることでした。
以下は、エクスポート機能の簡略版です。 Request オブジェクトはコンストラクターを介して渡されるため、ユーザーが UI で選択した内容に基づいてクエリを調整できます。
<?php namespace App\Exports; use App\User; use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\FromCollection; use Illuminate\Http\Request; class UsersExport implements FromCollection { use Exportable; protected Request $request; public function __construct(Request $request) { $this->request = $request; } public function collection() { return User::query() ->when($this->request->get('include_subscribed'), function ($q) { return $q->where('is_subscribed', true); }) ->cursor(); // ← 重要的一点 } }
プロジェクトでメモリの問題が発生していると思います。メモリ制限を増やしたので、問題が解決したことを願っています (私自身も何度もこれを行ってきました)。
これが Laravel プロジェクト内にある場合は、そのコードをもう一度見直して、LazyCollections を使用して書き直してもらいたいと思います。
この問題の修正は非常に興味深いので、少しベンチマークを実行しました。エクスポートでは、メモリ制限に達することなく数百万行を簡単にエクスポートできるようになりました。とてもクール!
以上がLazy Collections を使用して Laravel Excel 読み取りのパフォーマンスを向上させる方法の詳細な説明 (数百万のデータを簡単にサポート)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。