Come pianificare operazioni con October

Luca Benati

Pianificare tutte le operazioni che ci servono in momenti diversi utilizzando un solo cronjob, con October è molto semplice, vediamo come procedere.


Pubblicato da Luca Benati il 28 gennaio 2020

Normalmente in passato gli sviluppatori dovevano inserire un cronjob per ogni task che dovevano pianificare, cosa che a volte può essere un problema o semplicemente una scomodità.

Fortunatamente con October abbiamo la possibilità di definire la pianificazione dei comandi nel codice sorgente in modo trasparente ed espressivo inserendo un solo cronjob sul server.

Affinchè le nostre operazioni pianificate funzionino correttamente dovremo andare ad aggiungere un nuovo cronjob sul nostro server (operazione normalmente eseguita tramite il comando crontab -e)


* * * * * php /PERCORSO/CARTELLA/OCTOBERCMS schedule:run >> /dev/null 2>&1


Avendo cura di sostirure /PERCORSO/CARTELLA/OCTOBERCMS con il percorso alla root della propria installazione di October, dove risiede il file artisan.


Possiamo definire tutte le nostre operazioni pianificate facendo l'override del metodo registerSchedule nella classe di registrazione del plugin definita all'interno del file Plugin.php

Il metodo prende un solo argomento che si occuperà di gestire i comandi da eseguire e la loro frequenza.

Nell'esempio che segue stiamo programmando una Closure che verrà eseguita ogni giorno a mezzanotte, all'interno delal Clousure eseguiamo una query su una tabella del database e cancelliamo dei record per mantenerla pulita.


class Plugin extends PluginBase
{
    [...]

    public function registerSchedule($schedule)
    {
        $schedule->call(function () {
            \Db::table('utenti_scaduti')->delete();
        })->daily();
    }
}


Oltre che pianificare una Clousure possiamo anche programmare una chiamata ad un comando artisan come ad esempio pulire la cache in modo programmatico.


$schedule->command('cache:clear')->daily();

Oppure un comando al sistema operativo


$schedule->exec('python /home/nomeprogetto/miofile.py')->daily();

Le opzioni di pianificazione sono diverse e si possono trovare tutte nella pagina dedicata nella documantazione di October a questa pagina

Tra i vari metodi opzionali addizionali a quelli strettemante legati alla schedulazione troviamo l'utile withoutOverlapping.

Per impostazione predefinita i task vengono eseguiti anche se la precedente instanza dello stesso comando è ancora in esecuzione, con questa opzione diciamo a October di aspettare che venga terminato prima di venirne eseguita una secoonda istanza, questo ci viene molto utile soprattutto quando abbimao task di quali non conosciamo a priori la durata di esecuzione.

Nell'esempio che segue il comando emails:send verrà chiamato ogni minuto ma verrà eseguito solo se la chiamata precedente avrà terminato la sua esecuzione.


$schedule->command('emails:send')->withoutOverlapping();

Un'altro utilissimo metodo opzionale è sicuramente quello che ci permette di ricevere via mail l'eventuale output del comando richiamto semplicemente passando in nostro indirizzo email come parametro


$schedule->command('emails:send')->withoutOverlapping()->emailOutputTo('email@dominio.tld');

Naturalmente è possibile anche chiamare comandi di console personalizzati creati nel proprio plugin, cosa che vedremo in un apposito articolo.

Ricordiamo che tutti i dettagli sono disponibili nella documentazione disponibile a questa pagina

Happy coding!


Lunga vita e prosperità

Ti interessa un argomento non trattato?