07.13
Beanstalk es un software que permite poner tareas en cola, esto puede ser muy útil a la hora de realizar procesos que requieren mucho tiempo de ejecución y que pueden deteriorar la experiencia del usuario.
Al poner los procesos en cola, nuestra aplicación puede seguir su curso normal mientras se ejecutan las tareas encoladas en segundo plano, sin que el usuario lo note.
Para poder instalarlo en Debian o Ubuntu, debemos descargar la fuente y descomprimirla:
apt-get install libevent-1.4-2 libevent-dev
wget http://xph.us/dist/beanstalkd/beanstalkd-1.4.6.tar.gz
tar xzfv beanstalkd-1.4.6.tar.gz
Y se ejecuta:
beanstalkd -d -l 0.0.0.0 -p 11300
Esto causa que beanstalkd inicie en modo demonio, escuchando todas las direcciones en el puerto 11300.
La utilización de esta herramienta con CakePHP está muy bien explicada .
Con mi propia experiencia puedo aportar algunas cosas:
Enterrar procesos fallidos:
Cuando encolamos un proceso y este falla, podemos eliminarlo definitivamente o enterrarlo, para que luego pueda volver a ser ejecutado por beanstalk. Este método se llama “buri” y se usa más o menos asi:
En un shell de CakePHP (1.3):
| PHP | | copy code | | ? |
| 01 | |
| 02 | <?php |
| 03 | class EnviarMailShell extends Shell |
| 04 | { |
| 05 | var $uses = array('Queue.Job'); |
| 06 | var $tubes = array('enviar_mail'); |
| 07 | |
| 08 | function main() |
| 09 | { |
| 10 | App::import('Correo'); |
| 11 | while (true) { |
| 12 | $job = $this->Job->reserve(array('tube' => $this->tubes)); |
| 13 | $correo = new Correo(); |
| 14 | if ($correo->EnviarCorreo($job['Job']['id_usuario'])) { |
| 15 | $this->Job->delete(); |
| 16 | $this->out('Se ha enviado el correo exitosamente'); |
| 17 | } else { |
| 18 | $this->Job->bury(); //En caso de falla, lo enterramos! |
| 19 | } |
| 20 | } |
| 21 | } |
| 22 | } |
| 23 | ?> |
| 24 |
Volvemos a encolarlo con Kick:
| PHP | | copy code | | ? |
| 1 | |
| 2 | ClassRegistry::init('Queue.Job')->kick(array('tube' => 'enviar_mail')); |
| 3 |
Espero que les sirva.
