TGViewer
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter @phpproglib · 10.5K subscribers
Post #6193 2.07K
🧠 Обрабатывайте большие наборы данных порциями (Chunk) в Laravel

⚡ Почему это важно
Когда в таблице тысячи или миллионы записей, обычный get() или all() загрузит все строки в память сразу — это:
❌ сильно расточительно по памяти,
❌ может привести к падению по OOM,
❌ скрипт может не успеть выполнить работу целиком.
Для таких ситуаций Laravel предлагает метод chunk(), который загружает данные частями (порциями) вместо всего набора сразу.

🧰 Что делает chunk()
Метод chunk() берет определённое количество записей за раз и передает их в callback для обработки. Laravel автоматически загрузит следующую партию после завершения предыдущей.



use App\Models\User;

User::chunk(200, function ($users) {
foreach ($users as $user) {
// обработка каждого пользователя
}
});


📌 В этом примере Laravel:
загружает 200 пользователей за раз,
обрабатывает их,
затем переходит к следующей партии.

🧠 Почему это круто
Снижение пикового потребления памяти
Вместо загрузки всей таблицы в память — всего 200 записей. Это позволяет обрабатывать десятки и сотни тысяч строк без OOM.
Меньше рисков таймаута
Когда вы делаете работу по частям, выполнение разбивается на небольшие, предсказуемые блоки.
Гибкость для batch-обновлений/экспортов
Дизайн идеально подходит для миграций, обновлений атрибутов, экспортов CSV и фоновых задач.

🔍 Немного про chunkById() и улучшения
Если код обновляет записи внутри цикла, обычный chunk() может вести себя непредсказуемо, потому что набор может меняться. В таких случаях лучше использовать chunkById(), который гарантирует постоянный порядок по id и предотвращает пропуски/повторы при обновлениях.


User::chunkById(200, function ($users) {
foreach ($users as $user) {
$user->update(['active' => true]);
}
});


🧠 Продвинутые приёмы
💡 Жадная загрузка связей: если в обработке вам нужны связи (->with('profile')), загружайте их вместе с батчами — это предотвращает N+1-проблемы внутри chunk.


User::with('orders')->chunk(200, function ($users) {
foreach ($users as $user) {
// $user->orders уже загружены
}
});


💡 Используйте в фоновых командах или джобах: chunk() отлично подходит для консольных команд и jobs, которые работают с большими массивами данных и не должны завершиться по таймауту.

🧠 Когда chunk — не лучший выбор
❗ Если вам нужно просто вывести данные на страницу пользователю — лучше использовать пагинацию, а не chunk. chunk больше для обработки данных внутри приложения, а не для отдачи клиенту.

Библиотека пхпшника
  • 👍 5
  • ❤ 1
More from @phpproglib
  1. Sep 23, 2026🛠 Symfony 8.2 научился автоматически генерировать JSON Schema для конфигурации приложения…
  2. Sep 23, 2026🚀 Свежий релиз Laravel 13 с набором улучшений и исправлений ✅ добавлена поддержка valkey:…
  3. Sep 21, 2026⚡️ PHP 8.6 выйдет 19 ноября 2026 года. Сейчас версия находится в beta. Самые заметные изме…
  4. Sep 20, 2026❓ Какие существуют проблемы в многопоточной среде? Основные проблемы многопоточности: 1️⃣…
  5. Sep 19, 2026🌞 В Symfony 8.2 появилось 29 новых Bundle — теперь компоненты вроде Mailer, Messenger и C…
  6. Sep 19, 2026А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tp…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →