← Предыдущая · Назад к README · Следующая →
Генерация и расписание
Чтобы сгенерировать все активные фиды, используйте консольную команду:
php artisan feed:generate
В результате будут выполнены все активные фиды (is_active = true) из таблицы feeds или из таблицы, указанной в файле config/feeds.php.
Обратите внимание: если вызвать команду без параметра, консоль покажет ссылки на все фиды, в том числе со свойством is_active, равным false.
Но такие фиды не будут выполнены и получат статус SKIP.
Один фид
Указанный фид будет выполнен, даже если он отключён в таблице feeds базы данных.
Чтобы сгенерировать определённый фид, вызовите консольную команду feed:generate и передайте ей slug фида из таблицы feeds:
php artisan feed:generate products
Генерация выбранных выходных файлов
Для фида с отдельными выходными файлами slug записи выбирает класс фида, а ключ цели — одного партнёра, магазин, локаль или другой вариант вывода.
Запуск без --target лениво обрабатывает targets() и генерирует все цели:
php artisan feed:generate products
Передайте повторяемый параметр --target, чтобы сгенерировать только выбранные цели:
php artisan feed:generate products --target=42
php artisan feed:generate products --target=42 --target=81
Явно заданные ключи используют findTarget() вместо перечисления targets(). Повторяющиеся ключи обрабатываются один раз в порядке первого появления. Все запрошенные ключи разрешаются до начала генерации.
Для --target требуется один slug записи фида. Команда отклоняет пустые и неизвестные ключи, а также выбор цели для фида, который не реализует HasFeedTargets.
Полное перечисление целей выполняется потоково, а не атомарно. Если targets() завершится ошибкой после возврата нескольких значений, предыдущие цели уже могут быть сгенерированы или поставлены в очередь. Пустой итерируемый объект ничего не генерирует и не создаёт неявную цель по умолчанию.
Вывод для ИИ-агентов
Когда feed:generate выполняется внутри ИИ-агента для работы с кодом, распознанного Laravel Agent Detector, команда автоматически выводит один объект JSON вместо индикаторов прогресса и форматированных строк состояния. Дополнительный параметр команды не требуется. Вне распознанного агента обычный консольный вывод не меняется.
При прямой генерации каждый созданный фид содержит список всех опубликованных файлов и количество записей в каждом из них:
{
"tool": "feed:generate",
"result": "success",
"feeds": [
{
"class": "App\\Feeds\\SitemapFeed",
"status": "generated",
"files": [
{
"path": "/var/www/html/storage/app/public/sitemap.xml",
"records": 1250
}
]
},
{
"class": "App\\Feeds\\DisabledFeed",
"status": "skipped"
}
]
}
Команда выводит компактный JSON одной строкой. В примере он отформатирован только для удобства чтения.
| Статус | Значение | Дополнительные поля |
|---|---|---|
generated | Файлы фида созданы напрямую. | files с полями path и records для каждого файла |
queued | Режим очереди включён, и задание фида выполнено синхронно для агента. | Нет |
skipped | Фид неактивен, а команда выполнена без slug фида. | Нет |
Каждая целевая запись generated или queued также содержит поле target с выбранным ключом.
В режиме очереди ветка для агента синхронно выполняет каждое активное задание перед возвратом результата JSON. Обычная ветка с выводом для человека продолжает отправлять задания через настроенное подключение к очереди.
Эта оболочка JSON используется только при успешном выполнении. Если генерация завершается исключением, Laravel обрабатывает ошибку команды обычным способом и не выводит оболочку ошибки JSON.
Очередь
По умолчанию генерация фида выполняется в консольном процессе. Для фидов, требующих много времени или памяти, включите режим Laravel Queue в своём окружении:
FEED_QUEUE_ENABLED=true
FEED_QUEUE_CONNECTION=redis
FEED_QUEUE_NAME=feeds
FEED_QUEUE_UNIQUE_TTL=3600
Когда режим очереди включён, feed:generate отправляет по одной задаче для каждого обычного активного фида и каждой выбранной цели целевого фида. При асинхронном подключении команда завершается после отправки задач. Запустите обработчик очереди для выбранных подключения и очереди, чтобы обработать эти задачи.
FEED_QUEUE_CONNECTIONвыбирает подключение к очереди. Если значение не задано, используетсяQUEUE_CONNECTION, а затемdatabase.FEED_QUEUE_NAMEвыбирает очередь в этом подключении. Не задавайте значение, чтобы использовать очередь подключения по умолчанию.FEED_QUEUE_UNIQUE_TTLзадаёт максимальное время жизни блокировки уникальности в секундах. Обычные задания уникальны по классу фида. Целевые задания уникальны по классу фида и ключу цели; параметры цели не меняют этот идентификатор.
Подключение sync сразу выполняет каждую задачу в консольном процессе. Выберите асинхронное подключение, чтобы перенести генерацию в обработчик. Задайте FEED_QUEUE_ENABLED=false, чтобы генерировать фиды напрямую, без отправки задач.
Расписание
Выражение расписания
При создании записи фида передайте обычную строку cron-выражения или объект DragonCode\LaravelFeed\Scheduling\Expression с цепочкой методов.
use App\Feeds\ProductFeed;
use DragonCode\LaravelFeed\Queries\FeedQuery;
use DragonCode\LaravelFeed\Scheduling\Expression;
app(FeedQuery::class)->create(
class: ProductFeed::class,
title: 'Products',
expression: (new Expression)
->weekly()
->mondays()
->at('13:00'),
);
Пример с цепочкой методов сохраняет 0 13 * * 1. Обычные строки, включая поддерживаемые dragonmantank/cron-expression псевдонимы вроде @daily, по-прежнему можно передавать напрямую.
Доступные методы соответствуют вариантам частоты, которые предоставляет установленная версия Laravel. Актуальный список для Laravel 13 приведён в справочнике по частоте. Доступны только методы, результат которых можно сохранить как стабильное пятичастное выражение cron. Интервалы короче минуты, часовые пояса, ограничения по времени и lastDayOfMonth() в этом объекте недоступны.
Автоматическое
Чтобы автоматизировать генерацию фидов, используйте планировщик. Для этого добавьте вызов вспомогательного класса в файл routes/console.php, если стандартный путь не был изменён:
use DragonCode\LaravelFeed\Helpers\ScheduleFeedHelper;
use Illuminate\Support\Facades\Schedule;
ScheduleFeedHelper::register();
Schedule::call(function () {
// ... other action
})->everySecond();
Так регистрируются все активные фиды по расписанию из столбца expression базы данных. Целевой фид в расписании генерирует все значения, возвращённые targets().
Ручное
Расписание также можно задать напрямую по собственным правилам. В этом случае будут выполнены только указанные вами фиды.
use DragonCode\LaravelFeed\Commands\FeedGenerateCommand;
use Illuminate\Support\Facades\Schedule;
Schedule::command(FeedGenerateCommand::class, ['products'])
->withoutOverlapping()
->runInBackground()
->daily();
Schedule::command(FeedGenerateCommand::class, ['sitemap'])
->withoutOverlapping()
->runInBackground()
->hourly();
Schedule::call(function () {
// ... other action
})->everySecond();