Magento: cron jobs, el latir del corazón

Magento_cron_jobsEn una reunión en un café con unos colegas de trabajo estábamos hablando de CMSs, citando Magento, llegaron algunas preguntas como: ¿qué tiene Magento de especial? Pues una de las peculiaridades que le dan una gran potencia a Magento es la gestión de tareas programadas.

Magento nos obliga a disponer de un servidor en el que podamos configurar un programa, en este caso el cron de Magento, para que se ejecute cada x tiempo. Yo lo estoy instalando para que se ejecute a cada minuto. Este programa interno de Magento se llama cron igual que en Linux tenemos también el cron. Es el programador de tareas, no es el Crom de Conan el bárbaro que me comentaba un compañero de trabajo xDD

En las últimas versiones se ha pasado incluso el envío de emails transaccionales como tarea programada. Es decir, los emails transaccionales se envían a una cola de envío de emails y en la siguiente ejecución del cron se envían los que haya encolados. Estas tareas llevan un seguimiento, registro, etc.. A cada ejecución del cron de Magento le llamamos los desarrolladores heart beat en inglés, que significa el latir del corazón. Es decir, que Magento tiene un corazón, que late, y en cada latido puede que haga muchas cosas.. qué freak que suena esto, pero así es..

Me remito al anterior post en donde explico cómo crear un módulo propio como punto de partida.

Configurando un cron job en nuestro módulo

Partiendo de un módulo ya existente tenemos que editar nuestro app/code/local/vendorname/modulename/etc/config.xml dejándolo como algo parecido al siguiente:

<?xml version="1.0"?>
<config>
    <modules>
        <Jnjsite_Jnjinitial>
            <version>0.0.1</version>
        </Jnjsite_Jnjinitial>
    </modules>
    <global>
        <models>
            <jnjsite_jnjinitial>
                <class>Jnjsite_Jnjinitial_Model</class>
            </jnjsite_jnjinitial>
        </models>
    </global>
    <crontab>
        <jobs>
            <jnjsite_cron>
                <schedule>
                    <cron_expr>*/5 * * * *</cron_expr>
                </schedule>
                <run>
                    <model>jnjsite_jnjinitial/observer::aCronJob</model>
                </run>
            </jnjsite_cron>
        </jobs>
    </crontab>
</config>

Fíjate que hemos declarado el lugar donde van a estar los modelos. En este caso en app/code/local/Jnjsite/Jnjinitial/Model/, sino hacemos esto Magento no podrá encontrar la clase ni la función que debe ejecutar en la tarea programada.

Ahora bien, tenemos por otro lado declarada una tarea programada llamada jnjsite_cron que se ejecuta por defecto a cada 5 minutos según la notación Linux (*/5 * * * *). Me remito a la documentación oficial sobre los cronjobs de Linux para cambiar esto. Aquí podemos configurar el minuto, hora, día del mes, mes o día de la semana. Ahora necesitamos crear el fichero PHP que contiene la clase con la función que se ejecutará. En este caso, será el fichero Observer.php con su función pública aCronJob.

Escribimos entonces en el fichero app/code/local/Jnjsite/Jnjinitial/Model/Observer.php lo siguiente:

<?php

class Jnjsite_Jnjinitial_Model_Observer
{
    public function aCronJob()
    {
        $this->toLog('A simple log message.');
    }

    private function toLog($message)
    {
        Mage::log($message, Zend_Log::INFO, 'jnjsite.log', false);
    }
}

Esta tarea simplemente va a escribir en un fichero de log ‘jnjsite.log’ el mensaje ‘A simple log message.’ a nivel de ‘información’. Deberemos tener activados los logs de Magento para que realmente se escriba este mensaje en el fichero.

Comprobando que funciona

Vamos ahora a comprobar que funciona el código. Para esto tengo instalada la extensión Aoe_Scheduler que te muestra las tablas de la base de datos en el admin panel de Magento, facilitándote algunas tareas e información muy interesante. Es gratis así que la recomiendo 😉

Ahora tenemos que resetear la caché de Magento, vamos a Sistema > Scheduler > Job Configuration y debemos de ver la tarea configurada:

Magento jnjsite cronjob mostrado en el listado de tareas de Aoe Scheduler

En la imagen podemos ver que la tarea jnjsite_cron existe configurada desde fichero XML. También se pueden crear aquí tareas que llamen a ciertas funciones de nuestro código. Esto da más potencia al sistema.

Ahora bien, para comprobar que funciona, esta extensión nos muestra los registros de cron en Sistema > Scheduler > List View

Magento jnjsite cronjobs schedules

Cambié la configuración de la tarea para que se ejecutara a cada minuto. Magento programa en la cola de tareas su ejecución entonces por 15 minutos en adelante, de minuto en minuto. Podemos ver que las dos últimas tareas se ejecutaron. Sólo queda ver si realmente han hecho lo que tenían que hacer escribiendo el mensaje en el fichero de log.

Screenshot at 2016-08-07 02:28:44

Ya está, no tiene más historia. Sólo me queda decir que hay que escribir en logs la información para ir depurando la tarea, por eso que añadí la funcionalidad. Espero que sirva.

Al final la tarea programada a cada minuto está escribiendo el mensaje. Ya con esto lo dejo por hoy y me voy al sobre. Mañana más, y a ver si pronto puedo volver por aquí escribiendo más 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

2 ideas sobre “Magento: cron jobs, el latir del corazón”