post thumbnail

Laravel 4 desde Cero: Colas de Tareas

Publicado Por: Ramses Velasquez, El 21/03/2014


Detalles del Curso:

Dificultad: Novato

Duración: 15 min


En esta nueva entrada de Laravel 4 vamos a aprender a realizar colas de tareas con Redis. Esto nos ayuda a ejecutar tareas pesadas sin que el flujo de nuestro programa se vea afectado, ya que las tarea que encolemos se ejecutan cuando sea su turno en la cola. Pensemos en un ejemplo sencillo para tener esta idea un poco más clara.

Imaginemos que tenemos un código que sirve para registrar un usuario y enviar un correo de bienvenida, pero el servidor de correos que utilizamos esta lento y por lo tanto cuando el usuario hace submit a su registro la respuesta tarda. Una solución obvia es buscar otro servidor de correos, aunque también podemos insertar la tarea de mandar el correo en una cola que nuestro servidor siempre estará revisando para ir buscando cosas pendientes. De esta manera nuestro código solo registra al usuario, inserta la tarea de enviar el correo en una cola y luego devuelve la respuesta al usuario para hacer la experiencia del mismo más fluida. En resumen el proceso es que nuestro código va a ir llenando una lista de tareas y Laravel por otro lado las ira ejecutando.

Aquí es donde entra Redis, porque en el es donde Laravel guardara la lista de tareas que se irán ejecutando a medida que la cola se vaya vaciando. Cabe destacar que Laravel soporta diferentes formas de hacer las colas, pero ya que en nuestro pasado tutorial hicimos la conexión con Redis hoy la vamos a aprovechar. Debemos tomar en cuenta que el soporte para colas de tareas con Redis se agrego en Laravel 4.1, por lo tanto si estas utilizando una versión anterior no funcionara.


Configuración

La configuración para empezar a encolar tareas es muy sencilla, primero que nada debemos tener configurado Redis y para esto puedes leer Laravel 4 desde Cero: Redis. Luego debemos ir al archivo de configuración de las colas de tareas app/config/queue.php, buscamos el parámetro default y lo editamos para que utilice Redis como el almacén de tareas 'default' => 'redis',.


Encolar Tareas

Encolar las taras en muy sencillo y es una cosa de una sola linea. Hay diferentes parámetros que se pueden enviar al ahora de encolar una tarea, pero primero vamos a ver lo mas sencillo. Para realizar esta operación utilizamos el método Queue::push(). Veamos un ejemplo de como utilizarlo:

<?php
// Código que se ejecuto antes de encolar la tarea

// El primer parámetro es el nombre de la clase o modelo que ejecutara la tarea
// El segundo parámetro es un array con datos que se le van a pasar al método que ejecute la tarea
Queue::push('Correos', array('titulo'=>'Titulo para el correo', 'contenido'=>'contenido del correo'));

// Código que se ejecuta después de encolar la tarea, pero como se esta insertando en una cola entonces no se pierde tiempo comparado con el envío de un correo
?>

Si necesitamos ejecutar una tarea pero con un tiempo de retraso podemos utilizar el método Queue::later().

<?php
// El primero parámetro es el número de segundos que se retrasara la ejecución de la tarea en la cola 
// El segundo parámetro es la clase que ejecuta la tarea
// El tercer parámetro es la información que se envía
Queue::later(600, 'Correos', array('titulo'=>'Titulo para el correo', 'contenido'=>'contenido del correo'));
?>

Manejador de Tareas

Cada tarea que se inserta en la cola tiene un manejador (clase que se encargara de ejecutar la tarea). Esta clase debe tener un método llamada fire, el cual recibirá por defecto la ejecución de la tarea. Fire recibirá dos parámetros, el primero es un objeto con la información general de la tarea y el segundo es un array con los parámetros que se enviaron al encolarla. Al final del código de la tarea debemos borrarla permanentemente.

<?php
class Correos {

    public function fire($tarea, $datos){
        //código que ejecutara la tarea

        //cuando la tarea se ejecute debemos borrarla
        $tarea->delete();        
    }

}
?>

En caso de que necesitemos utilizar otro método que no sea fire, entonces debemos establecerlo al momento de insertar la tarea. Para hacer esto colocamos el nombre de la clase y el nombre del método separados con arroba (@) Correos@enviar_correo. Estos métodos también deberán tener dos parámetros como fire.


Verificar Cola

Para ejecutar las tareas Laravel incluye una funcionalidad con Artisan, la cual busca tareas nuevas las desencola y las ejecuta. Para comenzar a esperar tareas debemos ejecutar el comando queue:listen en la consola. Si ya habían tareas encoladas al momento que se active, entonces serán desencoladas y ejecutadas.

// este comando quedara abierto esperando por tareas nuevas que procesar
$ php artisan queue:listen

Conclusión

Podemos observar que las colas nos pueden ayudar a quitarnos de encima tareas pesadas que no necesiten feedback para el usuario y así brindar una mejor experiencia. Cualquier duda o comentario estaré atento a la sección de comentarios.


¿Te ha gustado esta publicación?

Compártela:

Por Ramses Velasquez

Conoce más sobre este autor aquí


comments powered by Disqus