Laravel 5: Programmare cron jobs e azioni ad una determinata ora

Cron jobs e scheduling con laravel? Da oggi si può!

Nel tutorial dedicato a laravel 5 di oggi vediamo come programmare cron jobs e azioni a una determinata ora del giorno all’interno di laravel.

Panoramica

NOTA: Questo tutorial si basa sulla versione 5.2 di Laravel. La funzione di Scheduling non è presente in versioni inferiori di Laravel (ad esempio non è presente con laravel 4).

All’interno delle nuove release di Laravel è presente una nuova funzionalità di scheduling che permette – di fatto – di usare il cron jobs in modo piu intelligente e utilizzabile direttamente all’interno delle nostre applicazioni in modo nativo.

Poniamo un esempio esplicativo. Senza questa feature per schedulare un’azione all’interno della nostra app dovremmo entra in cron sul server e settare al suo interno eventuali comandi linux. Il problema nasce quando sono da modificare. In questo caso di fatto dovremmo ri-accedere al server e variare. Laravel ci viene incontro in quanto permette di configurare UN SOLO cron jobs alla cadenza che desideriamo (suggerisco 1 ogni minuto) e ogni volta il cron viene elaborato il nostro artisan di laravel esegue automaticamente uno o più task impostati direttamente all’interno dell’app. 

Ma non solo: è possibile variare direttamente dentro di laravel una cadenza oraria (come ad esempio “esegui 1 volta al giorno alle ore xx:yy”).  O addirittura funzionalità particolarmente utili come esegui solo nel week end etc.

Vediamo come realizzarlo in termini pratici. 

Realizzazione

NOTA: Laravel ha già al suo interno un comodo esempio che potete de-commentare e usare per capire meglio le funzionalità dello scheduling ( di fatto l’esempio base stampa in console un aforisma). In questo esempio invece eseguiremo un’azione a ogni task e stamperemo in console “Azione eseguita”.

Aprimo per prima cosa il file Kernel.php che è il nostro “smistatore” con al suo interno tutti i task da eseguire a ogni avvio di cron.

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
       Commands\TestCron::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
       $schedule->command('testcron')->dailyAt('08:30');
    }
}

In questo esempio ho creato una classe ( e task) chiamato “TestCron” e lo avvio giornalmente alle 8.30

A questo punto creiamo il file TestCron.php all’iterno della cartella App\Console\Commands e incolliamo quanto segue:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class Rigenera extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'testcron'; // Nota deve essere uguale al command impostato sul Kernel

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'TestCron';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {


        //Azione da eseguire qui ad esempio update database etc

        //success stampato in console
        $this->info("Azione eseguita");
       


    }
}

A questo punto ci basta andare sul server alla sezione cron jobs e impostare:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

Ricordatevi di sostituire il path che punti al vostro file artisan. Su certi hosting ricordatevi di recuperare il percorso compresivo (ovviamente) di public_html etc nella maggior parte dei casi dovreste usare una path simile a questa – giusto per fare un esempio:

/home/accountsulserver/public_html/artisan

Piccolo tips: Se accedete da ssh da terminale e fate andare il comando: php artisan schedule:run equivale a forzare l’esecuzione dei command. Nel caso d’esempio dovreste vedere in risposta sul terminale l’informazione “Azione eseguita” 😉

E’ tutto, godetevi i vostri cron gestibili dentro laravel 5 ! 😉

Altre guide Docs

Questo articolo ti è stato utile? Condividilo!

 

Lascia la tua opinione

×