2016-11-17 3 views
0

Bonjour, J'ai une question à propos de l'ordonnancement des tâches. J'ai plusieurs contrôleurs, et je veux faire des appels à ces contrôleurs en utilisant la planification des tâches Laravel.J'ai ajouter une ligne de cronjob dans le serveur. J'ai un code comme celui-ci dans le fichier kernel.php, qui fonctionne essentiellement.Ordonnancement des tâches en parallèle dans Laravel

protected function schedule(Schedule $schedule) { 
    $schedule->call('App\Http\Controllers\[email protected]')->everyMinute()->name('firstController_cronjob')->withoutOverlapping(); 
    $schedule->call('App\Http\Controllers\[email protected]')->everyMinute()->name('secondController_cronjob')->withoutOverlapping(); 
    $schedule->call('App\Http\Controllers\[email protected]')->everyMinute()->name('thirdController_cronjob')->withoutOverlapping(); 
} 

Mais j'ai un problème. Ce script s'exécute de manière séquentielle. Est-il possible d'exécuter les contrôleurs Laravel en tant que tâche planifiée parallèle?

+0

cela n'a-t-il pas quelque chose à voir avec 'ShouldQueue'? – Mruf

+0

Je suis nouveau dans ce domaine. Pouvez-vous expliquer ou donner un exemple? –

Répondre

0

Il existe une méthode runInBackground() non mentionnée dans les documents Laravel mais listée dans their API.

Vous pouvez l'ajouter à chaque ligne $schedule:

$schedule->...->runInBackground(); 

et voir si ça aide. Je ne suis pas sûr si cela fonctionnera avec withoutOverlapping(), cependant. J'ai fait peu de test sur Laravel 5.2 avec PHP 7 et IIS et aucune des tâches n'a enregistré quoi que ce soit, malgré quelques Log::info() à l'intérieur. Il m'a également permis d'exécuter plusieurs commandes artisan schedule:run sans vérifier si la tâche était terminée.


Autre possibilité (pour artisan commandes) pourrait être d'utiliser Process classe directement pour démarrer les processus d'arrière-plan de Symfony:

use Symfony\Component\Process\Process; 

[...] 

protected function schedule(Schedule $schedule) { 

    $schedule->call(function() { 
     return (new Process('php artisan test:test'))->start(); 
    })->everyMinute(); 
} 

Dans ce cas, le script ne vérifie pas pour les tâches qui se chevauchent et l'ajout withoutOverlapping() peut pas suffisant - vous auriez plutôt besoin d'écrire vos propres méthodes pour ajouter/supprimer mutex et les exécuter dans le tâche elle-même.