Керування великими наборами даних у Laravel за допомогою Lazy Collection

3
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 грудня, 2025
Під час обробки великих обсягів даних у додатках Laravel важливо ефективно управляти пам'яттю. Досліджуйте можливості LazyCollection – потужного інструмента, який дозволяє обробляти великі набори даних, завантажуючи лише необхідні елементи за допомогою простих рішень

При обробці великих обсягів даних у програмах Laravel важливо ефективно управляти пам'яттю. LazyCollection — це розумне рішення, яке дозволяє завантажувати дані за запитом, а не одночасно. Розгляньмо цю потужну функцію для ефективного опрацювання великих наборів даних.

# Що таке LazyCollection

LazyCollection, доступна з Laravel 6.0, дозволяє ефективно обробляти великі набори даних, завантажуючи елементи лише за необхідності. Це ідеальний інструмент для роботи з великими файлами або широкими запитами до бази даних без перевантаження пам'яті вашої програми.

use Illuminate\Support\LazyCollection;
 
LazyCollection::make(function () {
    $handle = fopen('data.csv', 'r');
    while (($row = fgets($handle)) !== false) {
        yield str_getcsv($row);
    }
})->each(function ($row) {
    // Обробка даних рядка
});

# Приклад використання LazyCollection

Розгляньмо практичний приклад, у якому ми обробляємо великий файл журналу транзакцій та генеруємо звіти:

<?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());
        });
    }
}

З таким підходом ми можемо:

Для операцій з базою даних у Laravel є метод 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);
                });
        });
    }
}

Ця реалізація забезпечує ефективне використання пам'яті навіть при обробці мільйонів записів, що робить її ідеальною для фонових завдань та обробки даних

Популярні

Logomark Logotype

Простий пакет RabbitMQ для Laravel

Вам цікаво дізнатися, як спростити інтеграцію RabbitMQ у вашому Laravel-додатку? У нашій статті ми розглянемо пакет Simple RabbitMQ, який дозволяє легко налаштувати багатозʼєднання, публікувати повідомлення та обробляти черги за допомогою простого синтаксису. Читайте далі, щоб дізнатися більше!

Logomark Logotype

Інтеграція Laravel Socialite з бібліотекою Google Client PHP

Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті

Logomark Logotype

Як задокументувати кілька API в Laravel за допомогою Scramble

Ви знали, що в одному додатку Laravel можна реалізувати кілька API? У нашій статті ви дізнаєтеся, як за допомогою Scramble легко документувати різні версії API та налаштувати доступ до документації, щоб зробити її публічною або приватною. Читайте далі, щоб дізнатися більше