cursor() - потокове передавання великих наборів даних
При експорті 100,000 користувачів. get() завантажує все в пам'ять. Сервер падає.
cursor() передає результати один за одним. Константне використання пам'яті.
Як це працює:
Використовує MySQL cursor. Отримує один запис за раз. Пам'ять залишається низькою.
Коли використовувати:
- Експорт великих наборів даних
- Обробка величезних таблиць
- Середовища з обмеженою пам'яттю
Компроміс:
Тримає з'єднання з базою даних відкритим довше. Не для веб-запитів, ідеально для команд.
Порада: Використовувати в консольних командах та jobs, уникай в HTTP контролерах.
// ПОГАНО: Завантажує 100k записів в пам'ять
$users = User::all(); // Може впасти
foreach ($users as $user) {
$this->export($user);
}
// ДОБРЕ: Потокове передавання один за одним
foreach (User::cursor() as $user) {
$this->export($user); // Константна пам'ять
}
// В консольній команді
public function handle()
{
$this->output->progressStart(User::count());
foreach (User::cursor() as $user) {
$this->processUser($user);
$this->output->progressAdvance();
}
$this->output->progressFinish();
}
// З умовами
foreach (User::where('active', true)->cursor() as $user) {
// Обробляти тільки активних користувачів
}