Table des matières

File d'attente ou queue

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.

Commande utile pour supervisor

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:*

Config laravel

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

Les failed

$ 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!

Vieux systeme avec Laravel 4

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