Gestione Cron Job Magento 2
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" (<mage_dir>/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:
Supponendo di utilizzare l’utente del server user, avremo:
all’interno del file di configurazione, inseriamo le seguenti righe:
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 <mage_dir>/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:
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:
e subito dopo verifichiamo il crontab del nostro server con il comando crontab –l:
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:
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:
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:
<mage_dir>/app/code/WaPoNe/ProvaCron
Occupiamoci della registrazione del nostro plugin e creiamo i due seguenti file:
<mage_dir>/app/code/WaPoNe/ProvaCron/etc/module.xml
e <mage_dir>/app/code/WaPoNe/ProvaCron/registration.php
Installiamo il modulo con questa sequenza di comandi:
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:
<mage_dir>/app/code/WaPoNe/ProvaCron/etc/crontab.xml
quindi, come facilmente intuibile dal file di configurazione del cron, è necessario il file:
<mage_dir>/app/code/WaPoNe/ProvaCron/Cron/Observer.php
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:
<mage_dir>/app/code/WaPoNe/ProvaCron/etc/cron_groups.xml
Analizziamo nello specifico il significato dei campi di configurazione:
schedule_generate_every
: frequenza (in minuti) per la scrittura dei task nella tabella cron_scheduleschedule_ahead_for
: tempo (in minuti) in anticipo per la scrittura dei task nella tabella cron_scheduleschedule_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 databasehistory_success_lifetime
: tempo (in minuti) per salvare la storia del cron terminato con successo all’interno del databasehistory_failure_lifetime
: tempo (in minuti) per salvare la storia del cron terminato con insuccesso all’interno del databaseuse_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 (<mage_dir>/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:
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 (<mage_dir>/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.
☝ Ti piace quello che facciamo? Unisciti a noi!