Blog

Gestione Cron Job Magento 2

Lettura 6 minuti

Magento 2, esattamente come il suo predecessore Magento 1, utilizza i cron job per programmare l’esecuzione in maniera del tutto automatica di determinati compiti in specifici momenti.

Tra i cron job fondamentali di Magento ci sono attività indispensabili come:

  • applicazione di regole di prezzo
  • generazione della sitemap
  • re-indicizzazione
  • aggiornamento dei tassi di cambio delle valute
  • invio di tutte le e-mail (incluse le conferme d’ordine e le e-mail transazionali)

Queste sono solo alcune delle più importanti attività che Magento gestisce tramite cron, alle quali se ne possono poi aggiungere altre che uno sviluppatore può necessitare per il funzionamento corretto delle proprie estensioni, come verrà mostrato successivamente.

In una nuova installazione di Magento occorre configurare il sistema in maniera tale da avviare correttamente il “Magento cron job” per evitare malfunzionamenti del sito e-commerce, come ci viene avvertito nell’area di amministrazione.

L’utente del server candidato all’esecuzione del cron è l’utente “proprietario” del file system di Magento, lo stesso utente utilizzato per lanciare i vari comandi in linea tramite lo script “magento” (/bin/magento). E’ assolutamente vietato usare l’utente root ed è inoltre raccomandato evitare di scegliere l’utenza del web server.

Il crontab è la configurazione che viene usata per eseguire i cron job di Magento.

Magento usa il cron con due distinti insiemi di comandi e, per ognuno di essi, possono essere utilizzate differenti configurazioni:

  • Configurazione per il php da linea di comando: il cron job generale che re-indicizza gli indici, invia le e-mail, genera la sitemap e via dicendo.
  • Configurazione per il php del web server: due altri cron job usati dal Component Manager e dai sistemi di aggiornamento della piattaforma.

Per creare il crontab sul server bisogna lanciare il comando:

crontab -u <utente proprietario del file system di Magento> -e

Supponendo di utilizzare l’utente del server user, avremo:

crontab -u user -e

all’interno del file di configurazione, inseriamo le seguenti righe:

<percorso all’eseguibile php> <mage_dir>/bin/magento cron:run | grep -v “Ran jobs by schedule" >> <mage_dir>/var/log/magento.cron.log
<percorso all’eseguibile php> <mage_dir>/update/cron.php >> <mage_dir>/var/log/update.cron.log
<percorso all’eseguibile php> <mage_dir>/bin/magento setup:cron:run >> <mage_dir>/var/log/setup.cron.log

dove:

<percorso all’eseguibile php> è il percorso assoluto all’eseguibile php installato sul server (comando which php per scoprirlo), nel nostro caso supponiamo /usr/local/bin/php;

<mage_dir> è la directory dove è installato Magento, nel nostro caso /var/www/magento2

| grep -v “Ran jobs by schedule" filtra questo tipo di messaggio nei risultati del comando magento cron:run popolando il file di log _/var/log/magento.cron.log_ con i soli messaggi d’errore, rendendo di fatto più semplice l’individuazione di eventuali problematiche.

quindi nel nostro caso avremo:

/usr/local/bin/php /var/www/magento2/bin/magento cron:run | grep -v “Ran jobs by schedule" >> /var/www/magento2/var/log/magento.cron.log
/usr/local/bin/php /var/www/magento2/update/cron.php >> /var/www/magento2/var/log/update.cron.log
/usr/local/bin/php /var/www/magento2/bin/magento setup:cron:run >> /var/www/magento2/var/log/setup.cron.log

Dalla versione 2.2, Magento mette a disposizione dei parametri dello script “magento” per permettere di creare e rimuovere facilmente il cron job all’interno del crontab da linea di comando.

Quindi, con l’uso dell’utenza “proprietaria” del file system di Magento, ci posizioniamo nella directory root della nostra installazione e lanciamo il seguente comando:

php bin/magento cron:install

e subito dopo verifichiamo il crontab del nostro server con il comando crontab –l:

#~ MAGENTO START
/usr/local/bin/php /var/www/magento2/bin/magento cron:run 2>&1 | grep -v “Ran jobs by schedule" >> /var/www/magento2/var/log/magento.cron.log
/usr/local/bin/php /var/www/magento2/update/cron.php >> /var/www/magento2/var/log/update.cron.log
/usr/local/bin/php /var/www/magento2/bin/magento setup:cron:run >> /var/www/magento2/var/log/setup.cron.log
#~ MAGENTO END

Il cron job è stato avviato correttamente e, accedendo nell’area di admin infatti, è possibile notare che il messaggio di avviso è scomparso.

E’ possibile anche rimuovere il cron job dal crontab sempre tramite lo script “magento”, con il seguente comando:

php bin/magento cron:remove

Il comando appena visto avrà effetto solo ed esclusivamente sui cron job definiti all’interno del commento di apertura #~ MAGENTO START e quello di chiusura #~ MAGENTO END.

Infine, un’ulteriore alternativa disponibile: è possibile lanciare l’esecuzione dei cron job direttamente da linea di comando tramite la seguente istruzione:

php bin/magento cron:run [–group="<cron group name>"]

dove con –group si specifica il gruppo di cron job da eseguire, come spiegheremo in seguito.

Tutti i dati relativi ai cron job (ID, lo stato, data di creazione, di esecuzione ecc.) sono salvati nel database di Magento, nella tabella ‘cron_schedule’.

Ora proviamo a creare un semplice modulo con l’intento di generare un cron job che semplicemente scrive un messaggio nel file di debug.

All’interno della nostra installazione di Magento 2 andiamo nella cartella app/code e creiamo la directory WaPoNe (nome del vendor) con dentro la cartella ProvaCron (nome dell’estensione).

Abbiamo preparato in questa maniera la struttura del nostro modulo che sarà quindi:

/app/code/WaPoNe/ProvaCron

Occupiamoci della registrazione del nostro plugin e creiamo i due seguenti file:

/app/code/WaPoNe/ProvaCron/etc/module.xml

<?xml version="1.0″?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">

   <module name="WaPoNe_ProvaCron" setup_version="0.0.1″ />

</config>

e /app/code/WaPoNe/ProvaCron/registration.php

<?php

\Magento\Framework\Component\ComponentRegistrar::register(

   \Magento\Framework\Component\ComponentRegistrar::MODULE,

   ‘WaPoNe_ProvaCron’,

   __DIR__

);

Installiamo il modulo con questa sequenza di comandi:

php bin/magento cache:clean

php bin/magento setup:upgrade

A questo punto possiamo dedicarci alla preparazione del cron job.

I passaggi fondamentalmente consistono nella sua configurazione e nello sviluppo del compito che deve eseguire.

Per il primo step occorre creare il file:

/app/code/WaPoNe/ProvaCron/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="wapone_provacron_cron"

            instance="WaPoNe\ProvaCron\Cron\Observer"

            method="printLog">

           <schedule>*/5 * * * *</schedule>

       </job>

   </group>

</config>

quindi, come facilmente intuibile dal file di configurazione del cron, è necessario il file:

/app/code/WaPoNe/ProvaCron/Cron/Observer.php

<?php

namespace WaPoNe\ProvaCron\Cron;

class Observer

{

   protected $_logger;

   /**

    * @param \Psr\Log\LoggerInterface $logger

    */

   public function __construct(

       \Psr\Log\LoggerInterface $logger

   ) {

       $this->_logger = $logger;

   }

   // Functione chiamata dal cron job

   public function printLog()

   {

       $this->_logger->debug(“Saluti dal cron");

   }

}

Il nostro cron job è terminato e pronto per funzionare ma, proviamo a testarlo.

Per fare questo inventiamo un nuovo gruppo di cron al quale apparterrà il nostro.

Magento offre autonomamente i seguenti gruppi:

  • default, che contiene la maggior parte dei cron job
  • index, che si occupa dell’aggiornamento degli indici

Prepariamo il file che dichiara un nuovo cron group:

/app/code/WaPoNe/ProvaCron/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="wapone_gruppo">

       <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>

Analizziamo nello specifico il significato dei campi di configurazione:

  • schedule_generate_every: frequenza (in minuti) per la scrittura dei task nella tabella _cronschedule
  • schedule_ahead_for: tempo (in minuti) in anticipo per la scrittura dei task nella tabella _cronschedule
  • schedule_lifetime: finestra temporale (in minuti) entro la quale il cron job deve essere eseguito per non venir etichettato come “fallito”
  • history_cleanup_every: tempo (in minuti) per inserire la storia del cron nel database
  • history_success_lifetime: tempo (in minuti) per salvare la storia del cron terminato con successo all’interno del database
  • history_failure_lifetime: tempo (in minuti) per salvare la storia del cron terminato con insuccesso all’interno del database
  • use_separate_process: uso come processo separato (parametro disponibile dalla versione 2.1)

Salvato questo file è possibile vedere la nuova configurazione nell’area di amministrazione, in Stores -> Configuration -> Advanced -> System

Tornando al nostro file di configurazione del cron (/app/code/WaPoNe/ProvaCron/etc/crontab.xml), modifichiamo il gruppo sostituendo

<group id="default"> con <group id="wapone_gruppo">

in maniera tale da poter subito eseguire il nostro cron job.

Possiamo quindi lanciare il seguente comando, come visto precedentemente:

php bin/magento cron:run –group="wapone_gruppo"

Diamo un’occhiata alla tabella dei cron job, cron_schedule:

Il nostro cron job programmato ed eseguito con successo, in effetti provando a verificare il file dei log di debug (/var/log/debug.log) troviamo il messaggio “Saluti dal cron”.

Ora volendo, possiamo riassociare il cron job creato con il gruppo di default programmando quindi la sua esecuzione con il cron job di Magento.

In questo articolo abbiamo mostrato con gestire e configurare i cron job in Magento 2 e crearne di nuovi utili allo svolgimento di diverse tipologie di compiti da eseguire autonomamente in precisi momenti. I cron job sono un potente strumento che Magento mette a disposizione degli sviluppatori e la loro importanza nel contesto della piattaforma è fondamentale, come abbiamo documentato.

Michele Fantetti