:::: MENU ::::

Crear una tarea cron en Magento 2

2.91 avg. rating (58% score) - 11 votes

La creación de tareas cron en Magento 2 no ha cambiado demasiado respecto a lo que veíamos en Magento 1. Sólo hay algunas consideraciones a tener en cuenta.

Para definir una nueva tarea cron debemos hacerlo en el entorno de uno de nuestros módulos. Si todavía estáis empezando con Magento 2 y no habéis creado ningún módulo / extensión propia, podéis echar un vistazo al artículo Crear un módulo básico para Magento 2 en el que lo explicamos paso a paso.

Una vez tengamos nuestro módulo activo, debemos saber que la definición de tareas cron en Magento 2 se ha movido a un archivo propio crontab.xml, al contrario de lo que sucedía en Magento 1 donde se definían en el archivo de configuración generel del módulo. Para nuestro ejemplo utilizaremos un módulo llamado NV_CronExample.

Dentro de nuestro módulo, crearemos en primer lugar un archivo en la ruta NV/CronExample/etc/crontab.xml

El archivo contab.xml deberá tener un contenido similar al siguiente (lo explicamos a continuación):

<?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="nv_cron_example" instance="NV\CronExample\Cron\Test" method="execute">
            <schedule>* * * * *</schedule>
        </job>
    </group>
</config>

Más abajo incluimos la explicación detallada de cada parámetro.

También deberemos crear un nuevo archivo en nuestro módulo, en la ruta NV/CronExample/Cron/Test.php, con un contenido similar al siguiente:

<?php

namespace NV\CronExample\Cron;

use \Psr\Log\LoggerInterface;

class Test {

    protected $_logger;

    public function __construct (
        \Psr\Log\LoggerInterface $logger
    ) {
        $this->_logger = $logger;
    }

    public function execute() {
        $this->_logger->info(__METHOD__);
    }
}

Configuración de la tarea cron en Magento 2

Agrupación de tareas cron

La agrupación de tareas cron, es una de las novedades de Magento 2 para este tipo de configuración.

En Magento 2 podemos agrupar las tareas cron en diferentes grupos, de forma que podemos asignar diferentes parámetros al planificador de tareas para cada uno de los grupos, así como ejecutar todas las tareas de un grupo desde la línea de comandos. Lo veremos un poco más adelante en este mismo artículo.

El grupo al que asociamos la tarea se define mediante el id del nodo group. En el ejemplo hemos asignado el grupo default.

Magento 2 define por defecto dos grupos, que son index y default.

Configuración de la tarea cron en Magento 2

Además de la asignación a un grupo deberemos configurar los parámetros habituales para indicar a Magento 2 qué clase y método son responsables de la ejecución de la tarea. Estos parámetros son similares a los que encontrábamos en Magento 1.

En el ejemplo definimos que la tarea cron se ejecuta mediante la clase (instance) NV\CronExample\Cron\Test y el método execute.

Aunque no es obligatorio, por convención la mayoría de las tareas cron en Magento 2 se definen en una clase separada y con el método execute como punto de entrada para la ejecución. No obstante, como decimos, es opcional.

Nota adicional respecto al archivo Cron/Test.php

Otra de las diferencias entre Magento 1 y Magento 2, que ya hemos comentado en artículos anteriores, es que en Magento 2 no estamos limitados a la declaración de clases que realizábamos en Magento 1.

Antes agrupábamos las clases de nuestros módulos únicamente en Bloques, Modelos y Helpers, teniendo las carpetas Block, Model y Helper como únicas opciones para almacenar nuestras clases.

En Magento 2 esto ha cambiado, por lo que es posible tener la clase que hemos definido anteriormente dentro de una carpeta Cron en nuestro módulo.

Ejecución de tareas cron desde la línea de comandos

En Magento 2 disponemos de todo un interfaz de comandos para ejecutar diferentes tareas, y por supuesto podemos ejecutar tareas cron de forma manual con el comando siguiente:

php bin/magento cron:run [--group=<group_id>]



Hey! Qué opinas sobre el artículo?