Pular para o conteúdo principal
Versão: 1.x

← Anterior · Voltar ao README · Próximo →

Geração e agendamento

Para gerar todos os feeds ativos, use o comando:

php artisan feed:generate

Como resultado, todos os feeds ativos (is_active = true) da tabela feeds, ou da tabela definida em config/feeds.php, serão executados.

dica

Ao chamar o comando sem parâmetro, o console exibirá links para todos os feeds, inclusive aqueles cuja propriedade is_active está definida como false.

No entanto, esses feeds não serão executados: eles serão marcados com o status SKIP.

Feed individual​

aviso

O feed informado será executado mesmo que esteja desativado na tabela feeds do banco de dados.

Para gerar um feed específico, chame o comando feed:generate e passe como parâmetro o slug do feed na tabela feeds:

php artisan feed:generate products

Gerar arquivos de saída selecionados​

Em um feed configurado com arquivos de saída separados, o slug do registro seleciona a classe do feed e a chave do alvo seleciona um parceiro, uma loja, uma localidade ou outra saída.

Executar o feed sem --target consome targets() sob demanda e gera todos os alvos:

php artisan feed:generate products

Passe a opção repetível --target para gerar apenas os alvos selecionados:

php artisan feed:generate products --target=42
php artisan feed:generate products --target=42 --target=81

As chaves explícitas usam findTarget() em vez de enumerar targets(). Chaves duplicadas são processadas uma única vez, na ordem em que aparecem pela primeira vez. Todas as chaves solicitadas são resolvidas antes do início da geração.

--target exige um único slug de registro de feed. O comando rejeita chaves vazias ou desconhecidas e rejeita a seleção de alvos para um feed que não implementa HasFeedTargets.

A enumeração completa dos alvos é processada como fluxo, não como uma operação atômica. Se targets() falhar depois de retornar alguns valores, os alvos anteriores já poderão ter sido gerados ou enfileirados. Um iterável vazio não gera nada nem cria um alvo padrão implícito.

Saída para agentes de IA​

Quando feed:generate é executado dentro de um agente de codificação com IA reconhecido pelo Laravel Agent Detector, o comando grava automaticamente um único objeto JSON em vez de barras de progresso e linhas de status formatadas. Nenhuma opção de comando é necessária. Fora de um agente reconhecido, a saída normal do console permanece inalterada.

Na geração direta, cada feed gerado inclui todos os arquivos publicados e suas quantidades de registros:

{
"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"
}
]
}

O comando emite um JSON compacto em uma única linha. O exemplo está formatado apenas para facilitar a leitura.

StatusSignificadoCampos adicionais
generatedOs arquivos do feed foram gerados diretamente.files, com path e records para cada arquivo
queuedO modo de fila está ativado e o job do feed foi executado de forma síncrona para o agente.Nenhum
skippedO feed está inativo e o comando foi executado sem o slug de um feed.Nenhum

Cada entrada generated ou queued de um feed direcionado também contém um campo target com a chave selecionada.

observação

No modo de fila, o caminho específico do agente executa cada job ativo de forma síncrona antes de retornar o resultado JSON. O caminho normal, formatado para pessoas, continua despachando os jobs pela conexão de fila configurada.

Esse envelope JSON só é usado em execuções bem-sucedidas. Se a geração lançar uma exceção, o Laravel tratará o erro do comando normalmente e não emitirá um envelope de erro JSON.

Fila​

Por padrão, a geração dos feeds é executada no processo do console. Para feeds demorados ou que usam muita memória, ative o modo de fila do Laravel no ambiente:

FEED_QUEUE_ENABLED=true
FEED_QUEUE_CONNECTION=redis
FEED_QUEUE_NAME=feeds
FEED_QUEUE_UNIQUE_TTL=3600

Quando o modo de fila está ativado, feed:generate despacha um job para cada feed comum ativo e um job para cada alvo selecionado de um feed direcionado. Com uma conexão assíncrona, o comando termina depois que os jobs são despachados. Inicie um worker da fila para a conexão e a fila selecionadas a fim de processar esses jobs.

  • FEED_QUEUE_CONNECTION seleciona a conexão da fila. Na ausência dela, são usadas QUEUE_CONNECTION e depois database.
  • FEED_QUEUE_NAME seleciona uma fila nessa conexão. Deixe a variável sem valor para usar a fila padrão da conexão.
  • FEED_QUEUE_UNIQUE_TTL define em segundos o tempo de vida máximo do bloqueio de exclusividade. Jobs comuns são exclusivos pela classe do feed. Jobs direcionados são exclusivos pela classe do feed e pela chave do alvo; os parâmetros do alvo não alteram essa identidade.
observação

A conexão sync executa cada job imediatamente no processo do console. Selecione uma conexão assíncrona para transferir a geração para um worker. Defina FEED_QUEUE_ENABLED=false para gerar os feeds diretamente, sem despachar jobs.

Agendamento​

Expressão de registro​

Ao criar um registro de feed, passe uma string de expressão cron bruta ou um objeto DragonCode\LaravelFeed\Scheduling\Expression configurado por chamadas fluentes.

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'),
);

O exemplo com chamadas fluentes armazena 0 13 * * 1. Strings brutas, inclusive aliases compatíveis com dragonmantank/cron-expression, como @daily, continuam aceitas.

Os métodos fluentes disponíveis seguem as opções de frequência fornecidas pela versão instalada do Laravel. Consulte a referência de frequências do Laravel 13 para ver a lista atual. Somente métodos cujo resultado possa ser armazenado como uma expressão cron estável de cinco campos são expostos. Intervalos inferiores a um minuto, fusos horários, restrições de janela de tempo e lastDayOfMonth() não estão disponíveis nesse objeto de valor.

Automático​

Para automatizar a geração dos feeds, use um agendamento. Para isso, adicione a chamada do helper ao arquivo routes/console.php, que é o caminho padrão, a menos que você o tenha alterado:

use DragonCode\LaravelFeed\Helpers\ScheduleFeedHelper;
use Illuminate\Support\Facades\Schedule;

ScheduleFeedHelper::register();

Schedule::call(function () {
// ... other action
})->everySecond();

Isso registra todos os feeds ativos conforme o agendamento definido na coluna expression do banco de dados. Um feed direcionado agendado gera todos os valores retornados por targets().

Manual​

Você também pode definir o agendamento diretamente segundo suas próprias regras. Nesse caso, somente os feeds informados serão executados.

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();

Veja também​