Rumah > pembangunan bahagian belakang > tutorial php > Menguruskan dataset besar di Laravel dengan lazycollection

Menguruskan dataset besar di Laravel dengan lazycollection

百草
Lepaskan: 2025-03-05 16:33:21
asal
419 orang telah melayarinya

Managing Large Datasets in Laravel with LazyCollection

Pengurusan memori adalah penting apabila aplikasi Laravel memproses data besar -besaran. Lazycollection Laravel menyediakan penyelesaian yang cekap yang memuat data atas permintaan dan bukannya memuatkan semuanya sekaligus. Mari kita meneroka ciri yang kuat ini untuk memproses dataset yang besar.

Memahami Lazycollection

Lazycollection adalah ciri yang diperkenalkan selepas Laravel 6.0, membolehkan pemprosesan yang cekap bagi set data yang besar dengan memuatkan projek hanya apabila diperlukan. Ini menjadikannya ideal untuk mengendalikan fail besar atau pertanyaan pangkalan data yang besar tanpa mengatasi memori aplikasi.

use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('data.csv', 'r');
    while (($row = fgets($handle)) !== false) {
        yield str_getcsv($row);
    }
})->each(function ($row) {
    // 处理行数据
});
Salin selepas log masuk
Contoh Lazycollection

mari kita lihat contoh praktikal, di mana kita memproses fail log transaksi yang besar dan menghasilkan laporan:

<?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());
        });
    }
}
Salin selepas log masuk
Menggunakan kaedah ini, kita boleh:

    baca fail log mengikut baris
  • Tukar setiap entri log ke format yang kami harapkan
  • hanya penapis urus niaga yang lengkap
  • masukkan 500 rekod dalam kelompok
Untuk operasi pangkalan data, Laravel menyediakan kaedah

untuk membuat koleksi malas: cursor()

<?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);
                });
        });
    }
}
Salin selepas log masuk
Pelaksanaan ini memastikan penggunaan memori yang cekap walaupun memproses berjuta -juta rekod, menjadikannya sesuai untuk pekerjaan latar belakang dan tugas pemprosesan data.

Atas ialah kandungan terperinci Menguruskan dataset besar di Laravel dengan lazycollection. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan