web-dev-qa-db-fra.com

Programmer plusieurs crons dans Laravel

J'essaie d'exécuter plusieurs tâches dans Laravel à une heure différente.

protected function schedule(Schedule $schedule)
{
        $schedule->command('emails:send')
                 ->dailyAt('08:00');

        $schedule->command('emails:evening-status')
                 ->dailyAt('17:00');

        $schedule->command('email:weekly-report')
                 ->weekly()->mondays()->at('08:00');
}

Le problème ici est que seule la première commande - emails:send - fonctionne. Les autres commandes ne fonctionnent pas à l'heure spécifiée. Cependant, lorsque je les exécute manuellement, ils fonctionnent bien.

Qu'est-ce qui me manque?

20
nirvair

Je pense que vous devrez peut-être regarder votre configuration actuelle du serveur Cron. Laravel le planificateur exige que le serveur cron soit exécuté toutes les minutes pour que tous les programmes soient exécutés à l'heure souhaitée. Vous pouvez juste faire fonctionner le cron à 8h00 tous les jours au lieu de toutes les minutes.

Cela vaut peut-être la peine d’être vérifié, je sais que j’ai eu du mal à résoudre le même problème au tout début de la planification.

Lors de l'utilisation du planificateur, il vous suffit d'ajouter l'entrée Cron suivante sur votre serveur. Si vous ne savez pas comment ajouter des entrées Cron à votre serveur, envisagez d'utiliser un service tel que Laravel Forge, qui peut gérer les entrées Cron pour vous:

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

Ce Cron appellera le planificateur de commandes Laravel toutes les minutes. Lorsque la commande schedule: run est exécutée, Laravel évaluera vos tâches planifiées et exécutera les tâches à exécuter.

2
Sam Killen

Nous avons exécuté des problèmes similaires lors de l’introduction lors de l’utilisation du module de planification intégré de Laravel.

Dans notre cas, la première commande échouait silencieusement et empêchait l'exécution des commandes planifiées suivantes.

Pour un test rapide, essayez de changer l’ordre des commandes de telle sorte que les courriels: envoi se trouve en bas et voyez si cela fonctionne. En général, attrapez les exceptions qui pourraient être levées et cela devrait résoudre le problème.

0
AP-

Utiliser la file d'attente pour le traitement du travail

sur cron, ajoute tous les travaux à la file d'attente

Exécuter plusieurs travailleurs de la file d'attente

0
Rikal

Situation similaire, sauf que je peux appeler une méthode pour chaque cron en utilisant call, par exemple:

$schedule->call('\App\Http\Controllers\comm\commCron::abc');
$schedule->call('\App\Http\Controllers\comm\commCron::xyz');

J'ai eu le même problème, puis j'ai réalisé que le premier cron appelait un exit à un moment donné.

Donc, veuillez vous assurer qu'aucun des crons ne répète dans exit ou die(). Juste return false à la place (si vous en avez besoin).

0
Raheel Hasan

Si la deuxième commande ne fonctionne pas:

$schedule->command('emails:evening-status')
             ->dailyAt('17:00');

vous ne pouvez insérer qu'une seule ligne de code imprimant la date du jour dans certains fichiers, par exemple. "test.txt" puis enregistrez l'heure souhaitée si le fichier est créé. Si le fichier est créé, vous pouvez conclure que quelque chose ne va pas avec le code dans le script planifié.

0
fico7489