Перейти к основному содержимому
Версия: 1.x

← Предыдущая · Назад к 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();

Смотрите также​