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
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)
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
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"
Podeu utilitzar artisan per tal de crear una nova tasca (Job)
php artisan make:job SendReminderEmail
Recursos:
https://laravel.com/docs/master/queues#pushing-jobs-onto-the-queue
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