При обробці великих обсягів даних у програмах Laravel важливо ефективно управляти пам'яттю. 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) {
// Обробка даних рядка
});
Розгляньмо практичний приклад, у якому ми обробляємо великий файл журналу транзакцій та генеруємо звіти:
<?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);
});
});
}
}
Ця реалізація забезпечує ефективне використання пам'яті навіть при обробці мільйонів записів, що робить її ідеальною для фонових завдань та обробки даних
Вам цікаво дізнатися, як спростити інтеграцію RabbitMQ у вашому Laravel-додатку? У нашій статті ми розглянемо пакет Simple RabbitMQ, який дозволяє легко налаштувати багатозʼєднання, публікувати повідомлення та обробляти черги за допомогою простого синтаксису. Читайте далі, щоб дізнатися більше!
Ви хочете навчитися, як інтегрувати Google OAuth у вашому проекті Laravel, використовуючи Socialite? Дізнайтеся, як налаштувати доступ до сервісів Google, таких як Календар, у нашій сьогоднішній статті
Ви знали, що в одному додатку Laravel можна реалізувати кілька API? У нашій статті ви дізнаєтеся, як за допомогою Scramble легко документувати різні версії API та налаштувати доступ до документації, щоб зробити її публічною або приватною. Читайте далі, щоб дізнатися більше