Contextualizando
O que é um Cron job?
Um cron job (trabalho agendado) é uma ferramenta de agendamento que permite controlar tarefas repetitivas a serem executadas em tempos pré-configurados. Através de um trabalho agendado é possível executar determinadas tarefas em horários, datas ou intervalos fixos.
Código
crontab.xml
Os trabalhos agendados são configurados no arquivo crontab.xml
. É um arquivo que contém instruções para executar uma determinada tarefa automaticamente por determinados ciclos de um período. Esses arquivos devem seguir a estruturas de pastas \{Vendor}/{Module}/etc/{area}\crontab.xml
.
O Magento depende da configuração adequada para muitas tarefas importantes, incluindo indexação. Falhando na configuração pode resultar que o Magento não funcione como esperado.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
<group id="{group_name}">
<job name="{job_name}" instance="{Vendor}\{Module}\Cron\{CronName}" method="{methodName}">
<schedule>{time}</schedule>
</job>
</group>
</config>
- Group id: é um atributo obrigatório que contém o nome do grupo dos trabalhos agendados;
- Job name: é um atributo obrigatório que contém o ID único do trabalho agendado;
- Job instance: é um atributo obrigatório que contém o caminho da classe que será instanciada;
- Job method: é um atributo obrigatório que contém o método que será executado ao instanciar a classe;
- schedule: é uma tag terá um valor no formato dos agendamentos das crons.
Cron
Já os arquivos com a lógica que serão executados devem seguir a estrutura de pastas \{Vendor}\{Module}\Cron\{CronName}
e não devem estender nenhuma classe, apenas conter o nome do método que será definido no atributo method
do arquivo crontab.xml
.
<?php
namespace {Vendor}\{Module}\Cron;
class {CronName}
{
public function {methodName}(): {type}
{
// Code here
}
}
cron_groups.xml
Um grupo de trabalhos agendados é um grupo que permite a execução fácil de mais de um processo ao mesmo tempo. A maioria dos módulos do Magento utiliza o grupo default, caso a cron que esteja criando não pertença a este grupo ou um grupo já criado, este arquivo deve ser criado informando o nome do novo grupo . É possível declarar um novo grupo e especificar as opções de configurações (todas as configurações de acordo com o escopo) através do arquivo \{Vendor}\{Module}\etc\cron_groups.xml
.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/cron_groups.xsd">
<group id="{group_name}">
<schedule_generate_every>{time}</schedule_generate_every>
<schedule_ahead_for>{time}</schedule_ahead_for>
<schedule_lifetime>{time}</schedule_lifetime>
<history_cleanup_every>{time}</history_cleanup_every>
<history_success_lifetime>{time}</history_success_lifetime>
<history_failure_lifetime>{time}</history_failure_lifetime>
<use_separate_process>{binary}</use_separate_process>
</group>
</config>
- schedule_generate_every: frequência (em minutos) com que os planejamento são gravados na tabela cron_schedule;
- schedule_ahead_for: tempo (em minutos) de antecedência com que os planejamento são gravados na tabela cron_schedule;
- schedule_lifetime: janela de tempo (em minutos) que a tarefa agendada deverá ser iniciada ou será considerada como perdido;
- history_cleanup_every: tempo (em minutos) que o histórico dos trabalhos agendados é mantido no banco de dados;
- history_success_lifetime: tempo (em minutos) que o registro dos trabalhos agendados concluídos são mantidos no banco de dados;
- history_failure_lifetime: tempo (em minutos) que o registro de trabalhos agendados fracassados são mantidos no banco de dados;
- use_eparate_proccess: executa esse grupo de trabalho em um processo PHP separado.
Finalizando
Habilitando as alterações
Apague os arquivos que são gerados na compilação do Magento e execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc) e para limpar todos os caches de armazenamento em cache do processos.
rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento flush
Rodando as Crons
# Para executar todas as crons
php bin/magento cron:run
# Para executar as crons de um tereminado grupo
php bin/magento cron:run --group="{group_name}"
Magerun
Magerun é uma ferramenta CLI (Command Line Interface) que pornece algumas ferramentas para trabalhar com Magento, é possível saber mais acessando o site da documentação do n98-magerun.
Um dos comandos possíveis de executar com o magerun é executar apenas uma cron específica.
./n98-magerun.phar sys:cron:run {job_name}
Diretórios e Arquivos
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/
- code/
- {Vendor}/
- {Module}/
- Cron/
- {CronName}.php
- etc/
- crontab.xml
- module.xml
- registration.php
- composer.json