Statamic Peak

Article

Laravel Task Scheduling

Je vous présentation le Task Scheduling de Laravel et son utilisation dans un projet.

Dans certains projets, vous  allez devoir supprimer des éléments  après une certaine date d'expiration ou programmer un envoi de message. Il faut alors une fonctionnalité pour déclencher votre code au bon moment et non lors de la requête de l'utilisateur.

De manière générale, cela va concerner toutes les actions en rapport avec la notion de temps ou qui vont être automatisées. On parle de Tâches Planifiées.

Si vous êtes intéréssés par Laravel, j'écris un compendium sur le sujet pour regrouper tout ce qu'il y a à savoir.

Présentation de Laravel Task Scheduling

Laravel task scheduling est une manière de gérer ces tâches directement en PHP depuis votre dossier Laravel. Comme pour les migrations ou Eloquent, les avantages principaux sont :

  • la simplification des connaissances requises : vous pouvez tout faire en PHP et les outils mis à disposition sont pratiques et de haut niveau
  • l'ajout de fonctionnalités souvent utilisées comme la gestion des timezones ou des dates de début et de fin

Installation

Pour démarrer, vous devez disposer d'un projet laravel et ajouter une tâche planifiée à cron. Cette manipulation doit être faite seulement une fois au déploiement du projet. Par exemple, elle peut être effectué par votre administrateur système ou votre équipe devops. De cette façon, vos développeurs n'ont pas besoin de connaître la syntaxe de cron.

Cron ? Kézako?

C'est un programme qui permet d'exécuter des scripts et programmes à une date et heure spécifiées ou selon un cycle définis à l'avance. Pour cela, on ajoute nos tâches dans une crontab : un fichier avec une syntaxe particulière pour indiquer quand et à quel intervalle on veut que cron lance notre commande.

Configuration pour le planificateur de tâches de laravel

On ajoute la ligne suivante à la crontab via crontab -e :

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Cette dernière va appeler le planificateur de tâches de laravel toutes les minutes et tout le reste sera géré par le framework. Il n'y a besoin de faire cette modification uniquement une seule fois par projet et non à chaque nouvelle tâche planifiée.

Créer une tâche planifiée

Pour exécuter une action de manière répétitive, il ne nous reste plus qu'à l'inclure dans la fonction schedule de la classe App\Console\Kernel.

$schedule->call(function () {
	DB::table('recent_users')->delete();
})->daily();

Par exemple, ici on indique que le planificateur doit supprimer toutes les lignes de la table recent_users tous les jours.

On peut déclencher simplement des commandes Laravel. L'avantage est que vous pourrez utiliser le même code en ligne de commande si besoin par exemple lors d'une intervention en SSH sur le serveur.

$schedule->command('emails:send Taylor --force')->daily();
$schedule->command(EmailsCommand::class, ['Taylor', '--force'])->daily();

Ici, on demande à Laravel d'exécuter la commande emails tous les jours. Dans le premier cas, on passe la commande complète sous la forme d'une chaine de caractères, comme on la saisirait dans un terminal. Dans l'autre exemple, on utilise la classe créée. Cela permet notamment d'utiliser l'autocompletion de l'IDE et éviter les erreurs de saisie.

Il existe de nombreux paramètres définis pour personnaliser la planification en fonction de vos besoins. Vous pouvez non seulement choisir le délai entre chaque appel à votre fonction mais aussi limiter les jours ou fournir votre propre fonction de condition pour exécuter ou non votre tâche planifiée.