La docs ⇒ https://laravel.com/docs/5.4/queues
Installer supervisord
Créer un fichier de config
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/app.com/artisan queue:work --sleep=3 --tries=3 autostart=true autorestart=true user=www-data numprocs=8 redirect_stderr=true stdout_logfile=/var/www/app.com/storage/logs/worker.log
Les options :
php artisan queue:work : permet de charger laravel en RAM et d’attendre qu’un job arrive. ATTENTION si vous modifiez le code de laravel, il ne sera pas pris en compte.
Pour recharger laravel dans le queue:worker, 2 solutions :
supervisorctl restart laravel-worker:*
php artisan queue:restart
Pour executer un job, pour des tests, on peut lancer la commande
php artisan queue:work --once
Une alternative : php artisan queue:listen contrairement a queue:work qui lui ne charge laravel que la 1ere fois, queue:listen charge laravel, exécute le job et ferme laravel, et ceci à chaque job. Ca peut être bien en dev quand le code change souvent, mais a éviter en prod car ça utilise beaucoup de ressource.
Supervisor a un shell
# supervisorctl supervisor> ? default commands (type help <topic>): ===================================== add clear fg open quit remove restart start stop update avail exit maintail pid reload reread shutdown status tail version supervisor>
mais on peut l’utiliser en ligne de commande.
Si vous ajoutez un fichier de config, les commandes suivantes montre les nouveaux worker et les activent, puis les démarrent
supervisorctl reread supervisorctl update supervisorctl start laravel-worker:*
Si vous modifiez un fichier de config (sans changer le nom du program), la commande suivante restart le worker avec la nouvelle config
supervisorctl update
Pour tout stopper
supervisorctl stop all
ou un worker
supervisorctl stop laravel-worker:*
Pour tout restarter
supervisorctl restart all
ou un worker
supervisorctl restart laravel-worker:*
Dans config/queue.php, mettez database par défaut
'default' => env('QUEUE_DRIVER', 'database'),
Vérifiez aussi dans votre fichier .env
QUEUE_DRIVER=database
puis
'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'retry_after' => 90, ],
Si vous mettez un nom de queue spécifique, soit vous le spécifiez dans le fichier de config
'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'mon_nom_de_queue', 'retry_after' => 90, ],
soit vous le spécifiez dans la commande artisan
command=php /var/www/app.com/artisan queue:work --tries=3 --queue=mon_nom_de_queue
Le retry_after est le nombre de seconde avant de relancer un job qui génère une exception
$ php artisan queue:failed +----+------------+---------+--------------------------------+---------------------+ | ID | Connection | Queue | Class | Failed At | +----+------------+---------+--------------------------------+---------------------+ | 3 | database | Imports | App\Jobs\ImportSubscribersFile | 2017-06-14 23:11:54 | | 2 | database | Imports | App\Jobs\ImportSubscribersFile | 2017-06-14 23:10:16 | | 1 | database | Imports | App\Jobs\ImportSubscribersFile | 2017-06-14 23:08:46 | +----+------------+---------+--------------------------------+---------------------+
$ php artisan queue:retry 1 The failed job [1] has been pushed back onto the queue!
$ php artisan queue:forget 2 Failed job deleted successfully!
Tuto en anglais ⇒ http://laravel.com/docs/queues
Tuto en français ⇒ http://docs.laravel.fr/4.1/queues
Super tuto ⇒ http://fideloper.com/ubuntu-beanstalkd-and-laravel4
On apprend à utiliser un gestionnaire asynchrone de tache ⇒ Beanstalkd
On apprend à utiliser un service permettant de s’assurer qu’une commande tourne tout le temps ⇒ Supervisord