Heim > Backend-Entwicklung > PHP-Tutorial > Verwaltung großer Datensätze in Laravel mit LazyCollection

Verwaltung großer Datensätze in Laravel mit LazyCollection

百草
Freigeben: 2025-03-05 16:33:21
Original
416 Leute haben es durchsucht

Managing Large Datasets in Laravel with LazyCollection

Speicherverwaltung ist von entscheidender Bedeutung, wenn Laravel -Anwendungen massive Daten verarbeiten. Die LazyCollection von Laravel bietet eine effiziente Lösung, die Daten nach Bedarf lädt, anstatt alles auf einmal zu laden. Lassen Sie uns diese leistungsstarke Funktion untersuchen, um große Datensätze effektiv zu verarbeiten.

Verstehe LazyCollection

LazyCollection ist eine nach Laravel 6.0 eingeführte Funktion, mit der große Verarbeitung großer Datensätze durch Laden von Projekten nur bei Bedarf ermöglicht werden können. Dies macht es ideal, um große Dateien oder große Datenbankabfragen zu bearbeiten, ohne den Speicher der Anwendung zu überwältigen.

use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('data.csv', 'r');
    while (($row = fgets($handle)) !== false) {
        yield str_getcsv($row);
    }
})->each(function ($row) {
    // 处理行数据
});
Nach dem Login kopieren

LazyCollection Beispiel

Schauen wir uns ein praktisches Beispiel an, in dem wir eine große Transaktionsprotokolldatei verarbeiten und einen Bericht erstellen:

<?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());
        });
    }
}
Nach dem Login kopieren

Mit dieser Methode können wir:

  • Lesen Sie Protokolldateien nach Zeile
  • Konvertieren Sie jeden Protokolleintrag in das Format, von dem wir
  • erwarten
  • Filter nur abgeschlossene Transaktionen
  • 500 Datensätze in Stapel
  • einfügen

cursor() Für Datenbankvorgänge bietet Laravel die

-Methode zum Erstellen einer faulen Sammlung:
<?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);
                });
        });
    }
}
Nach dem Login kopieren

Diese Implementierung gewährleistet die effiziente Speicherverwendung auch bei der Verarbeitung von Millionen von Datensätzen und macht sie ideal für Hintergrundjobs und Datenverarbeitungsaufgaben.

Das obige ist der detaillierte Inhalt vonVerwaltung großer Datensätze in Laravel mit LazyCollection. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage