Производительность на больших наборах данных
Laravel Feeds записывает данные постепенно. Память остаётся ограниченной, только если каждый предыдущий шаг приложения остаётся ленивым.
Оставляйте запрос ленивым
Возвращайте Builder Eloquent напрямую:
public function builder(): Builder
{
return Product::query()
->select(['id', 'title', 'updated_at'])
->where('is_exportable', true);
}
Не материализуйте весь результат до генерации. Выбирайте только нужные столбцы и заранее загружайте только связи, которые использует item(), чтобы избежать запросов N+1.
Настраивайте размер блока
Значение по умолчанию — 1000 записей. Меньшие значения снижают пиковый расход памяти моделями и увеличивают число запросов. Большие значения уменьшают накладные расходы запросов и повышают расход памяти. Измеряйте на строках производственного размера.
public function chunkSize(): int
{
return 500;
}
Разделяйте выходные файлы
Используйте perFile(), если потребитель принимает несколько файлов или один вывод становится сложно публиковать и повторять.
public function perFile(): int
{
return 50000;
}
Оставляйте для maxFiles() значение по умолчанию 0, если нужно экспортировать все подходящие записи. Когда perFile() и maxFiles() больше нуля, Laravel Feeds экспортирует не больше их произведения и успешно завершает генерацию, не сообщая о пропущенных последующих записях. Задавайте maxFiles() только для намеренного ограничения числа записей.
Отправляйте долгие фиды в очередь
Режим очереди выносит генерацию из процесса консоли, но не уменьшает память, нужную фиду. Используйте асинхронное подключение, обработчики с подходящими ограничениями и TTL уникальности больше ожидаемого времени генерации.
Измеряйте весь путь
Отдельно измеряйте базу данных, создание моделей, преобразование, сериализацию и публикацию. Удалённый диск может стать основной затратой даже при быстрой генерации.