Laravel 13.35 Nouveauté Publié le

Arrêter proprement une commande longue avec schedule:interrupt

schedule:interrupt date son signal, et hasBeenInterruptedSince() le lit : une commande longue s'arrête entre deux lots, sans couper le lot en cours.

Notions abordées : ConsolePlanification

Nouveau dans Laravel 13.35. php artisan schedule:interrupt demande aux tâches planifiées de s'arrêter, par exemple avant un déploiement. Mais une commande déjà lancée, surtout en arrière-plan (runInBackground()), ne l'entendait pas : elle allait au bout, ou se faisait tuer au milieu d'un lot.

Depuis Laravel 13.35

L'interruption est maintenant datée, et Schedule::hasBeenInterruptedSince() dit si elle a eu lieu depuis un moment donné. Une commande longue la consulte à un endroit où s'arrêter ne casse rien :

use Illuminate\Console\Scheduling\Schedule;

public function handle(Schedule $schedule)
{
    $debut = now();

    foreach ($this->lots() as $lot) {
        if ($schedule->hasBeenInterruptedSince($debut)) {
            return;
        }

        $this->traiter($lot);
    }
}

Comparer à l'heure de départ, et non à « une interruption existe », compte : le signal d'un déploiement de la veille reste en cache, et ne doit pas bloquer les passages suivants.

À faire

La commande relances:envoyer relance chaque nuit les factures impayées, par lots de dix. Un lot commencé doit aller à son terme : arrêté au milieu, il relancerait certains clients deux fois.

Faites-la s'arrêter entre deux lots quand schedule:interrupt a été lancée depuis son départ. Les factures restantes partiront au prochain passage.

D'où vient la fonctionnalité : la pull request d'origine.