Crear cronjobs en Magento

por David Abad
Crear cronjobs Magento

Un cronjob es una tarea programada que se ejecuta automáticamente en un momento específico. En Magento, los cron jobs se utilizan para tareas como la sincronización de inventario, la limpieza de caché y la generación de informes, aunque es posible implementar cron jobs para tareas personalizadas.

Crear cronjob en Magento

Magento permite la creación de tareas periódicas en módulos personalizados, que se lanzan según una expresión de tiempo establecida.

1. Crear un fichero PHP con el código de la tarea en <Modulo>/Cron/<MiTarea>.php

<?php

namespace MiVendor\MiModulo\Cron;

class MiTarea
{
    public function execute()
    {
        // TODO
    }
}

2. Crear un fichero XML para definir la nueva tarea, así como la expresión de tiempo que define su periodicidad en  <Modulo>/etc/crontab.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="mi_tarea" instance="MiVendor\MiModulo\Cron\MiTarea" method="execute">
            <schedule>* * * * *</schedule>
        </job>
    </group>
</config>

La expresión de tiempo (etiqueta “schedule”) sigue la nomenclatura típica de Linux Crontab. En caso de ser necesario, existen servicios como Crontab Guru que proporcionan ayuda para la elaboración de este tipo de expresiones. 

Por otro lado, en vez de definir una expresión de tiempo concreta (etiqueta “schedule”), es posible que la periodicidad de la tarea se obtenga de un parámetro configurable desde el administrador (etiqueta “config_path”).  

Cron Groups en Magento

Los cron jobs de Magento se agrupan en diferentes “cron groups”. Estos cron groups permiten lanzar tareas en procesos independientes y pueden tener diferentes configuraciones en cuanto al mantenimiento de la cola y el histórico de tareas.

La mayoría de procesos de Magento son lanzados en los cron groups “default” o “index”, pero es posible definir nuevos grupos personalizados en los ficheros <Modulo>/etc/cron_groups.xml de nuestros módulos:

<config>
    <group id="MI_CRON_GROUP">
        <schedule_generate_every>1</schedule_generate_every>
        <schedule_ahead_for>4</schedule_ahead_for>
        <schedule_lifetime>2</schedule_lifetime>
        <history_cleanup_every>10</history_cleanup_every>
        <history_success_lifetime>60</history_success_lifetime>
        <history_failure_lifetime>600</history_failure_lifetime>
        <use_separate_process>1</use_separate_process>
    </group>
</config>
  • schedule_generate_every: Frecuencia (minutos) en la que se revisan las tareas pendientes de ejecutar y se programan las futuras tareas.
  • schedule_ahead_for: Tiempo de antelación (minutos) con el que las futuras tareas se programan, escribiéndose en la tabla cron_schedule de base de datos. 
  • schedule_lifetime: Tiempo de retraso (minutos) permitido para la ejecución de las tareas programadas. Si una tarea programada no es ejecutada en este tiempo, será descartada.
  • history_cleanup_every: Frecuencia (minutos) con la que se realiza limpieza del histórico de tareas de la tabla cron_schedule de base de datos.
  • history_success_lifetime: Tiempo (minutos) que se mantendrán en el histórico (cron_schedule) las tareas que han sido ejecutadas correctamente.
  • history_failure_lifetime: Tiempo (minutos) que se mantendrán en el histórico (cron_schedule) las tareas que han sido ejecutadas con error.
  • use_separate_process: Ejecución de las tareas en un proceso PHP independiente al del resto de cron groups.

Ejecución de cron jobs

La ejecución de los cron jobs de Magento puede realizarse de forma manual, utilizando el siguiente comando:

bin/magento cron:run [--group=GROUP]

Por defecto, este comando lanza las tareas de todos los cron groups disponibles. Sin embargo, el comando también permite la ejecución de las tareas de un único grupo, indicándolo con el flag group=GROUP.

Para que la ejecución de estas tareas se realice de forma automática, es necesario incluir el comando anterior en el crontab del sistema, de modo que sea lanzado cada minuto. Para facilitar esto, Magento incluye un comando que configura automáticamente el crontab del sistema:

bin/magento cron:install

Tabla cron_schedule

La planificación y el histórico de tareas se mantiene en la tabla cron_schedule de la base de datos de Magento. 

Esta tabla es leída y escrita por el comando bin/magento cron:run y almacena tanto las tareas que ya han sido ejecutadas, como las tareas que serán ejecutadas próximamente.

Magento: Cron Schedule

  • schedule_id: Identificador interno de la tarea.
  • job_code: Código de la tarea a ejecutar.
  • status: Estado de la tarea (pending, running, missed, error, success).
  • messages: Posibles mensajes devueltos por las tareas ejecutadas.
  • created_at: Fecha en la que la tarea es incluida a la tabla cron_schedule.
  • scheduled_at: Fecha prevista para la ejecución de la tarea.
  • executed_at: Fecha de comienzo de ejecución de la tarea. 
  • finished_at: Fecha de fin de ejecución de la tarea.

Emulación de área y store

Los cron jobs en Magento son lanzados desde el área “crontab”, sin embargo algunas tareas (envío de correos, gestión de clientes, tratamiento de pedidos, etc.) requieren ser realizadas desde el scope de frontend de una store concreta.

Por ello, en muchas ocasiones se requiere la emulación de una store concreta desde el código de nuestras tareas.

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos