Maison >développement back-end >tutoriel php >Gérer les grands ensembles de données à Laravel avec LazyCollection
La gestion de la mémoire est cruciale lorsque les applications Laravel traitent des données massives. LazyCollection de Laravel fournit une solution efficace qui charge les données à la demande plutôt que de tout charger en même temps. Explorons cette fonctionnalité puissante pour traiter efficacement les grands ensembles de données.
LazyCollection est une caractéristique introduite après Laravel 6.0, permettant un traitement efficace de grands ensembles de données en chargeant des projets uniquement en cas de besoin. Cela le rend idéal pour gérer des fichiers volumineux ou de grandes requêtes de base de données sans submerger la mémoire de l'application.
use Illuminate\Support\LazyCollection; LazyCollection::make(function () { $handle = fopen('data.csv', 'r'); while (($row = fgets($handle)) !== false) { yield str_getcsv($row); } })->each(function ($row) { // 处理行数据 });
Regardons un exemple pratique, dans lequel nous traitons un grand fichier journal de transaction et générons un rapport:
<?php namespace App\Services; use App\Models\TransactionLog; use Illuminate\Support\LazyCollection; class TransactionProcessor { public function processLogs(string $filename) { return LazyCollection::make(function () use ($filename) { $handle = fopen($filename, 'r'); while (($line = fgets($handle)) !== false) { yield json_decode($line, true); } }) ->map(function ($log) { return [ 'transaction_id' => $log['id'], 'amount' => $log['amount'], 'status' => $log['status'], 'processed_at' => $log['timestamp'] ]; }) ->filter(function ($log) { return $log['status'] === 'completed'; }) ->chunk(500) ->each(function ($chunk) { TransactionLog::insert($chunk->all()); }); } }
En utilisant cette méthode, nous pouvons:
Pour les opérations de base de données, Laravel fournit la méthode cursor()
pour créer une collection paresseuse:
<?php namespace App\Http\Controllers; use App\Models\Transaction; use Illuminate\Support\Facades\DB; class ReportController extends Controller { public function generateReport() { DB::transaction(function () { Transaction::cursor() ->filter(function ($transaction) { return $transaction->amount > 1000; }) ->each(function ($transaction) { // 处理每笔大额交易 $this->processHighValueTransaction($transaction); }); }); } }
Cette implémentation garantit une utilisation efficace de la mémoire même lors du traitement des millions d'enregistrements, ce qui le rend idéal pour les travaux de fond et les tâches de traitement des données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!