Les tâches planifiées dans Laravel sont utiles lorsque vous avez besoin d’exécuter une tâche à un moment donné. Vous pourriez avoir besoin d’exporter vers un fichier Excel tous les soirs, ou vous pourriez avoir besoin d’envoyer un rappel à un utilisateur à une certaine heure. Vous pourriez créer un job Cron ou une tâche planifiée pour chacune de ces tâches séparément, mais cela pourrait devenir difficile à maintenir, surtout si vous avez beaucoup de tâches planifiées. Heureusement, Laravel dispose d’un planificateur de tâches intégré qui vous permet de définir vos programmes au sein de votre application et de les exécuter à l’aide d’une seule tâche Cron.

Définition des planifications
Les planifications sont définies dans la méthode schedule
de la classe App\Console\Kernal
. Par exemple, supposons que nous ayons une méthode d’archivage des anciennes commandes que nous voulons exécuter au début de chaque mois. Nous pourrions la définir comme suit :
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Models\Order;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*/
protected function schedule(Schedule $schedule): void
{
$schedule->call(function () {
Order::archive();
})->monthly();
}
}
Il existe différentes façons de définir les planifications :
- Fermetures : Comme nous l’avons vu dans l’exemple ci-dessus, vous pouvez utiliser la méthode
call
pour lancer une fermeture qui exécutera le code programmé. - Objets invocables : Les classes PHP qui contiennent une méthode
__invoke
peuvent également être exécutées à l’aide de la méthodecall
. Par exemple, si vous avez un objet appeléOrderArchive
qui gère la logique d’archivage, vous pouvez définir le calendrier en utilisant$schedule->call(new OrderArchive())->monthly()
. - Commandes : En utilisant la méthode
command
, vous pouvez planifier une commande Artisan ou une commande système. Par exemple, si vous avez défini une commande appeléearchive:orders
pour effectuer l’archivage, vous pouvez définir la planification en utilisant$schedule->command('archive:orders')->monthly()
. - Jobs en file d’attente : La méthode
job
vous permet de planifier l’exécution d’un travail en file d’attente. Par exemple, si vous avez défini un travail appeléArchiveOrders
pour effectuer l’archivage, vous pouvez définir la planification à l’aide de$schedule->job(new ArchiveOrders)->monthly()
.
Fréquence des planifications
Le planificateur de Laravel dispose de plus de 30 méthodes pour définir la fréquence d’exécution de votre tâche planifiée. Nous ne les énumérerons pas toutes ici, mais voici quelques exemples :
- everyMinute();
- everyFiveMinutes();
- hourly();
- hourlyAt(20);
- daily();
- dailyAt(’13:00′);
- weekly();
- weeklyOn(1, ‘8:00’);
- monthly();
- twiceMonthly(1, 16, ’13:00′);
- yearly();
Contraintes des planifications
Vous pouvez restreindre davantage votre horaire. Par exemple, si vous souhaitez programmer une notification qui ne sera envoyée que pendant les heures de travail, vous pouvez procéder comme suit :
$schedule->call(function () {
User::sendNotification();
})->hourly()
->weekdays()
->between("8:00", "18:00");
Pour une liste complète des fréquences et des contraintes, visitez cette page de la documentation Laravel (en anglais).
Personnalisation des planifications
Si aucune des fréquences ou contraintes fournies ne permet de créer la planification souhaitée, et que tu es familier avec l’écriture d’expressions Cron, vous pouvez utiliser la méthode Cron en utilisant les expressions souhaitées.
À titre d’exemple, cette fonction doit s’exécuter toutes les cinq minutes à partir de 13 h et jusqu’à 13 h 55, puis à partir de 18 h et jusqu’à 18 h 55 tous les jours :
$schedule->call(function() {
//Add schedule code here
})->cron('0/5 13,18 * * ?');
Exécution des planifications
Le planificateur de Laravel peut être exécuté manuellement à l’aide de la commande schedule:run
. Dans un environnement de production, vous créerez généralement une tâche Cron qui exécutera artisan schedule:run
une fois par minute.
Dans un environnement de développement, vous n’exécutez généralement pas de tâche Cron. À la place, vous pouvez utiliser la commande schedule:work
, qui exécutera la commande schedule:run
une fois par minute.
Autres options pour les planifications
Le planificateur de Laravel dispose d’un certain nombre d’autres options qui sont utiles dans certaines circonstances. Si vous avez une tâche qui est exécutée toutes les quelques minutes, mais qui peut avoir un temps d’exécution très variable, vous pouvez utiliser la méthode withoutOverlapping()
pour empêcher la tâche de s’exécuter si l’instance précédente de la tâche est toujours en cours d’exécution. De même, si vous avez une tâche qui prend beaucoup de temps à s’exécuter, vous pouvez utiliser la méthode runInBackground()
pour qu’elle n’empêche pas d’autres tâches de s’exécuter avant qu’elle ne soit terminée. Si plusieurs serveurs sont en cours d’exécution, vous pouvez utiliser onOneServer()
pour exécuter la tâche sur un seul serveur.
Pour plus de détails sur le planificateur de tâches de Laravel, consultez la documentation de Laravel (en anglais).