IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

Oco amb la documentació a Internet que encara podeu trobar de versions anteriors de Laravel com:

http://laravel.com/docs/5.0/bus

on s'explica la command bus. Això ara ja no està a la nova documentació i utilitzem Jobs. La documentació és:

https://laravel.com/docs/master/queues

Vegeu també l'article Command Bus

Conceptes previs

Interessant veure l'screencast:

https://laracasts.com/series/whip-monstrous-code-into-shape/episodes/2

On explica que bàsicament un Job és un Use case (en català cas d'ús). De fet s'utilitzen molts noms per al mateix com Non queued job, Self Handling Command (no necessita d'un Command Bus)

Configuració

Es realitza al fitxer:

config/queue.php

El driver per defecte és Sync com podeu veure:

'default' => env('QUEUE_DRIVER', 'sync'),

Que també apareix al fitxer .env per defecte:

$ cat .env | grep QUEUE
QUEUE_DRIVER=sync

Configuració amb beanstalkd

Només cal canviar el driver al fitxer .env:

 $ cat .env | grep QUEUE
QUEUE_DRIVER=beanstalkd

I instal·lar el paquet:

$ composer require "pda/pheanstalk:~3.0"

Drivers per a queues

  • Synchronous: és el que està activat per defecte i el que fa es realment no tenir activades les cues ja que s'executen de forma síncrona.
  • Beanstalkd
  • IronMQ
  • Amazon SQS
  • Redis
  • També existeix un null queue driver que s'utilitza per cancelar totes les tasques que són enviades a la cua (forat negra)

Crear una nova tasca

Podeu utilitzar artisan per tal de crear una nova tasca (Job)

php artisan make:job SendReminderEmail


Recursos:

Posar una tasca a la cua

https://laravel.com/docs/master/queues#pushing-jobs-onto-the-queue

Executant les tasques a la cua. Queue listener

Tenim una comanda artisan per fer aquesta tasca:

$ php artisan queue:listen  

De fet hi ha múltiples comandes relacionades amb les cues:

$ php artisan | grep queue
queue:failed             List all of the failed queue jobs
queue:failed-table    Create a migration for the failed queue jobs database table
queue:flush              Flush all of the failed queue jobs
queue:forget            Delete a failed queue job
queue:listen             Listen to a given queue
queue:restart           Restart queue worker daemons after their current job
queue:retry              Retry a failed queue job
queue:subscribe      Subscribe a URL to an Iron.io push queue
queue:table              Create a migration for the queue jobs database table
queue:work              Process the next job on a queue

El que us interessarà realment és que les tasques a la cua s'executin constantment i que tinguem algun sistema que controli i s'assegurir que la comanda:

 $ php artisan queue:listen

S'executa constantment i que en cas d'errada es torna a iniciar! Amb Ubuntu ho podeu fer amb Upstart però també podeu utilitzar la forma a l'estil Laravel utilitzant Supervisor. Seguint les instruccions de la web de laravel el que s'ha de fer és dins la màquina homestead craer un fitxer de configuració:

$ homestead ssh
$ sudo editor /etc/supervisor/conf.d/laravel-worker-homestead.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/Code/MyProject/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=vagrant
numprocs=8
redirect_stderr=true
stdout_logfile=/home/vagrant/Code/MyProject/storage/logs/worker.log

NOTA: Observeu com la configuració està feta per una màquina homestead en cas de fer-ho a un servidor en explotació com Forge caldria adaptar els valors. Per exemple:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/mydomain.com/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/mydomain.com/worker.log

Apliqueu els canvis amb:

$ sudo /etc/init.d/supervisor restart
Restarting supervisor: supervisord.

Comproveu que està funcionant correctament amb:

$ ps aux | grep artisan
vagrant   8288  3.7  1.1 303204 90508 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8289  3.9  1.1 303204 90652 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8290  3.3  1.1 303204 90448 ?        S    13:49   0:00 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8291  3.1  1.1 303204 90472 ?        S    13:49   0:00 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8292  3.3  1.1 303204 90564 ?        S    13:49   0:00 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8293  3.4  1.1 303204 90616 ?        S    13:49   0:00 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8294  4.2  1.1 303204 90552 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8295  4.2  1.1 303204 90472 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon

Correcte 8 processos tal i com li hem demanat! Comproveu com supervisor s'encarrega de tornar a executar un procés si pel que sigui el procés es mor:

$ kill -9 8288

Observeu com apareix un procés nou:

$ ps aux | grep artisan
vagrant   8289  0.0  1.1 303204 90652 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8290  0.0  1.1 303204 90448 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8291  0.0  1.1 303204 90472 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8292  0.0  1.1 303204 90564 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8293  0.0  1.1 303204 90616 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8294  0.1  1.1 303204 90552 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8295  0.1  1.1 303204 90472 ?        S    13:49   0:01 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon
vagrant   8457 20.0  1.3 319956 106760 ?       R    14:15   0:00 php /home/vagrant/Code/GlobalsDD/PrivacyDriver/artisan queue:work beanstalkd --sleep=3 --tries=3 --daemon


Recursos

Vegeu també

Enllaços externs