Cron no Magento 2- Entendendo a funcionalidade

Se você já trabalhou com o Magento 2, provavelmente entende que o sistema agenda e executa certas tarefas rotineiramente. Essas tarefas agendadas fazem parte da funcionalidade cron no Magento 2.

Como as tarefas agendadas funcionam no Magento pode não ser tão simples quanto você pensa. Portanto, é importante primeiro entender como os cron jobs funcionam no M2 antes de conseguir configurar e implementar um. Para isso, vamos abordar, de forma clara, o que é um cron, assim como todos os termos e componentes relacionados. Além disso, discutiremos como eles se relacionam e funcionam com o framework do Magento.

cron no Magento 2

Qual é a diferença entre cron, crontab e cron job?

Antes de começarmos, você pode facilmente confundir a terminologia principal baseada em cron e não saber como usar os termos corretamente, assim como entender a diferença entre eles.

Um cron é um serviço daemon de aplicação que roda no servidor e executa tarefas agendadas. Nesse contexto, você pode pensar nele como um aplicativo de software em segundo plano que, de maneira eficiente, executa trabalhos a partir de um arquivo crontab. Assim, ele garante que o sistema realiza as tarefas automaticamente conforme o cronograma que definimos.

Um crontab é um arquivo de configuração, e seu nome é a abreviação de cron table. Um arquivo crontab contém uma lista de tarefas que executamos em um cronograma definido em horários específicos. Este cronograma é definido em um formato de expressão cron (por exemplo, * * * * *).

Um cron job é, portanto, uma tarefa agendada individual que aparece em um arquivo crontab. Além disso, pode haver um ou, em alguns casos, muitos cron jobs definidos dentro de um único arquivo crontab. Essa flexibilidade nos permite gerenciar várias tarefas de forma organizada e eficiente em um único arquivo.

Como o Cron funciona com o Magento?

Em aplicações PHP normais, você normalmente define muitos cron jobs dentro de um único arquivo crontab. Então, cada tarefa executa-se conforme o cronograma especificado na expressão cron.

Por exemplo, aqui está um arquivo crontab que contém dois cron jobs:

/etc/crontab

# Run a PHP script every day at 3:00 AM
0 3 * * * /usr/bin/php /var/www/html/daily_backup.php

# Run another PHP script every 30 minutes
*/30 * * * * /usr/bin/php /var/www/html/check_notifications.php

No Magento, as coisas funcionam de maneira um pouco diferente. Gerenciar e manter muitos cron jobs para múltiplos módulos dentro de um único arquivo crontab se torna extremamente difícil, já que esse arquivo está fora do escopo de um projeto Magento. Isso significa que o sistema não o gerencia dentro de um sistema de controle de versão, o que dificulta a administração entre múltiplos ambientes.

Assim, como alternativa, para instâncias do Magento, definimos um único cron job, que é o mesmo para todos os ambientes e que se apresenta como uma variação do seguinte:

/etc/crontab

* * * * * /usr/local/bin/php /var/www/html/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/var/log/magento.cron.log

O comando acima executa o script bin/magento cron:run a cada minuto, conforme definido pela expressão cron * * * * *. Tudo que segue esse comando, essencialmente, direciona a saída da execução desse comando para o arquivo /var/log/magento.cron.log.

Isso significa que a gestão e execução de tarefas agendadas no Magento é completamente controlada pelo comando cron:run do Magento. A cada minuto, executamos o bin/magento cron:run, que, por sua vez, chama o script PHP nativo do Magento.

Definindo cron jobs no Magento

Com essa arquitetura de cron job única em funcionamento, o Magento, de fato, implementa seu próprio sistema de cron internamente. Como resultado, isso permite que módulos personalizados aproveitem a funcionalidade de tarefas agendadas do Magento de maneira eficaz.

Além disso, os cron jobs são uma parte essencial da estrutura do Magento. Eles garantem que as operações funcionem de maneira suave e cuidam de tudo, desde a indexação de produtos até o envio de e-mails para os clientes. Portanto, você também pode aproveitar a funcionalidade interna de cron do Magento para definir suas próprias tarefas agendadas personalizadas, adaptando-as às suas necessidades específicas.

Assim como podemos definir um arquivo crontab em um servidor Unix, podemos definir nosso próprio arquivo crontab dentro do Magento, mas, conforme o padrão do Magento, deve ser um arquivo XML.

Qual é o propósito de crontab.xml?

O propósito do arquivo crontab.xml é especificar os seguintes detalhes para cada cron job:

  • Nome do Job: Um identificador para o cron job, que deve ser único entre todos os outros cron jobs no Magento.
  • Cronograma: Definimos a frequência com que o cron job deve executar, na sintaxe da expressão cron.
  • Modelo de Execução: Definimos a classe e o método que o sistema deve executar quando o cron job acionar.

Este arquivo é colocado dentro do arquivo etc/crontab.xml de qualquer módulo Magento e se assemelha a algo como o seguinte:

etc/crontab.xml

<?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="default">
        <job name="daily_backup" instance="Vendor\Module\Cron\DailyBackup" method="execute">
            <schedule>0 3 * * *</schedule>
        </job>
        <job name="check_notifications" instance="Vendor\Module\Cron\CheckNotifications" method="execute">
            <schedule>*/30 * * * *</schedule>
        </job>
    </group>
</config>

Você notará que as tarefas daily_backup e check_notifications são os mesmos cron jobs que os exemplos anteriores que analisamos, mas esta é a vez em que apresentamos o formato XML do crontab do Magento. Nós definimos a instância da classe que é responsável por esse cron job e o método que executaremos.

Grupos de Cron

Observando o exemplo acima e praticamente qualquer outro arquivo crontab.xml no Magento, você perceberá que o ID do grupo é sempre “default“. Este é o grupo padrão usado para organizar os cron jobs.

Dito isso, você pode definir seu próprio nome de grupo personalizado para organizar melhor suas tarefas de cron job. Por exemplo, definir <group id="foo"> coloca seus cron jobs em um novo grupo chamado “foo“. Embora você normalmente use o grupo padrão, usar um grupo personalizado pode ser vantajoso, especialmente durante o desenvolvimento, pois o Magento também permite que você execute cron jobs por grupo com:

bin/magento cron:run --group=foo

Essa linha executará apenas os cron jobs associados ao grupo foo.

Essa abordagem, sem dúvida, permite que você se concentre em seus cron jobs personalizados durante o desenvolvimento, sem ativar todos os outros cron jobs no Magento. Como resultado, isso pode economizar muito tempo, especialmente quando você está imerso no processo de desenvolvimento e depuração de seu código. Assim, você pode otimizar seu fluxo de trabalho e aumentar sua produtividade durante a fase de desenvolvimento.

crontab.xml funciona com cron_schedule

Embora o comando principal cron:run seja executado a cada minuto, as expressões cron definidas nos arquivos crontab.xml assumem o controle. Esses arquivos crontab funcionam em conjunto com a tabela de banco de dados cron_schedule do MySQL para determinar quando o cron job foi executado pela última vez e quando deve ser executado novamente.

A tabela cron_schedule do banco de dados

Quando um cron job é agendado para ser executado com base na configuração definida no arquivo crontab.xml relacionado, o Magento cria uma entrada correspondente na tabela cron_schedule dentro do MySQL. Esta tabela mantém um registro do status de execução e outros detalhes sobre cada instância de cron job.

A tabela cron_schedule contém as seguintes colunas:

  • job_code: O identificador único da instância do cron job, conforme definido na propriedade job.name do arquivo crontab.xml.
  • status: O status atual da instância do cron job (por exemplo, pendente, em execução, sucesso, perdido, erro).
  • messages: Informações específicas da instância do cron job.
  • created_at: O carimbo de data/hora indica o momento em que criamos a instância do cron job.
  • scheduled_at: O carimbo de data/hora quando a instância do cron job está agendada para execução.
  • executed_at: O carimbo de data/hora indica quando a instância do cron job realmente começou a ser executada.
  • finished_at: O carimbo de data/hora indicaquando a instância do cron job terminou de ser executada.
  • group: O grupo definido para a instância do cron job; normalmente, default.
  • hostname: O nome do servidor que executou a instância do cron job, útil se você estiver executando múltiplas instâncias do Magento para processar cron jobs.
  • duration: O número de segundos que a instância do cron job levou para ser executada.
  • pid: O ID do processo do tick de execução relacionado do bin/magento cron:run.
  • kill_request: O carimbo de data/hora quando o processo da instância do cron job foi encerrado.

Quando o processo cron do Magento é executado, ele busca por jobs pendentes na tabela cron_schedule e os executa com base em seu horário agendado.

cron no Magento 2

Informações importantes sobre a tabela cron_schedule

Há algumas coisas importantes a serem consideradas em relação à tabela cron_schedule:

  • Status dos Cron Jobs: Preste atenção à coluna de status na tabela cron_schedule. Se você notar um alto número de status “perdido” ou “erro”, isso pode indicar problemas com sua configuração de cron ou a implementação específica do cron job.
  • Desempenho do Cron Job: Monitore os carimbos de data/hora executed_at e finished_at para garantir que os cron jobs estejam sendo executados de maneira oportuna. Se você observar atrasos significativos ou longos tempos de execução, isso pode sugerir gargalos de desempenho ou restrições de recursos.
  • Tamanho da Tabela: A tabela cron_schedule pode crescer bastante ao longo do tempo, especialmente se você tiver muitos cron jobs configurados. Limpe regularmente as entradas antigas da tabela para evitar crescimento excessivo e manter as operações em ótimo desempenho.
  • Configuração do Cron: Certifique-se de que o cron do seu servidor esteja adequadamente configurado para executar o processo cron do Magento. Sem uma configuração de cron correta, nenhum dos jobs definidos nos arquivos crontab.xml será executado.

Recapitulação

Para concluir, a funcionalidade do cron no Magento 2 é uma ferramenta poderosa para gerenciar tarefas agendadas dentro da plataforma. Ao entender a relação entre os arquivos de configuração crontab.xml e a tabela de banco de dados cron_schedule, você pode criar, monitorar e solucionar problemas de cron jobs personalizados de forma mais eficaz como desenvolvedor Magento.

Aqui estão algumas lições que você deve lembrar:

  • Não defina cron jobs dentro de um cron do sistema, mas sim no arquivo crontab.xml apropriado usando a sintaxe adequada que o Magento espera que você utilize.
  • Utilize grupos de cron para organizar e executar seletivamente conjuntos específicos de cron jobs durante o desenvolvimento.
  • Monitore a tabela cron_schedule em busca de anomalias ou problemas de desempenho.
  • Limpe regularmente entradas antigas na tabela cron_schedule para manter um desempenho ideal.
  • Certifique-se de que o cron do seu servidor esteja corretamente configurado para executar o processo cron do Magento.
cron no Magento 2

Seguindo essas diretrizes e melhores práticas, você pode aproveitar todo o potencial da funcionalidade de cron do Magento 2 para automatizar tarefas, otimizar o desempenho e manter sua loja funcionando sem problemas.

Fonte: M.academy