LazyCollection у Laravel пропонує зручні засоби для розумної обробки великих наборів даних, визначаючи чіткі тимчасові рамки. Функція обмеження часу запобігає безкінечній роботі операцій, забезпечуючи максимальну продуктивність у межах заданих обмежень.
Механізм таймауту оцінює тривалість обробки відносно вказаного часу, автоматично зупиняючи обробку, коли ліміт досягнуто:
use Illuminate\Support\LazyCollection;
$results = LazyCollection::times(INF)
->takeUntilTimeout(now()->addMinutes(3))
->each(function (int $item) {
return expensive_computation($item);
});
Існує кілька способів для ефективного проходження через набір даних з дотриманням часових обмежень. Використання генераторних функцій разом з механізмами таймауту створює ефективні процесингові канали для великих обробок:
use Illuminate\Support\LazyCollection;
use App\Models\Transaction;
$processed = LazyCollection::make(function () {
$cursor = 0;
while (true) {
$batch = Transaction::where('id', '>', $cursor)
->orderBy('id')
->limit(500)
->get();
if ($batch->isEmpty()) {
break;
}
foreach ($batch as $transaction) {
yield $transaction;
}
$cursor = $batch->last()->id;
}
})
->takeUntilTimeout(now()->addMinutes(20))
->filter(function ($transaction) {
return $transaction->requires_processing;
})
->each(function ($transaction) {
$transaction->process();
})
->count();
Створення системи фінансової звітності демонструє практичні застосування таймаутів на різних етапах обробки. Цей підхід є дуже ефективним для робіт з пакетами, які повинні завершуватися в межах робочих годин, зберігаючи при цьому узгодженість даних і можливість проведення аудиту.
Функція таймауту безперешкодно інтегрується в наявну інфраструктуру Laravel, автоматично завершуючи обробку, коли час перевищено, без переривання частково виконаних операцій і без створення неузгодженого стану даних.