Laravel 4 desde Cero: Colas de Tareas

Publicado el 21 marzo 2014 por Codehero @codeheroblog

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:

// 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

1234567 // 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 tareaQueue::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().

// 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'));

1234 // 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íaQueue::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.

class Correos { public function fire($tarea, $datos){ //código que ejecutara la tarea //cuando la tarea se ejecute debemos borrarla $tarea->delete(); } }

12345678910 classCorreos{   publicfunctionfire($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

12 // este comando quedara abierto esperando por tareas nuevas que procesarphp 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.