CakePHP Queue Plugin

Después de más tiempo del que nos gustaría sin poder escribir nada (por falta de tiempo, no porque no haya multitud de temas interesantes que tratar acerca de Cake), hemos encontrado un plugin que debemos explicar, pues resulta verdaderamente interesante en casi cualquier proyecto de desarrollo, ¿quién no estaría interesado en integrar en su web una cola de tareas que permita ir realizándolas de manera progresiva sin perjudicar el rendimiento del sitio? Este comportamiento nos lo proporciona el plugin CakePHP Queue Plugin y resulta muy interesante, sobre todo, para tareas de envío de correo. Podríamos optar por utilizar un cron para realizar estas tareas, este plugin plantea prácticamente la misma idea con un desarrollo verdaderamente sencillo y múltiples opciones de configuración muy útiles.

Seguiremos la explicación que proporciona MSeven en su web para ir comentando paso a paso cómo utilizar este plugin:

1. Instalación

* Copiamos los ficheros proporcionados en la carpeta plugins

* Ejecutamos el siguiente comando desde la consola de CakePHP (en /cake/console/):

cake schema run create -path plugins/queue/config/sql -name queue

2. Configuración:

El plugin nos permite añadir un archivo de configuración personalizado (app/config/queue.php), que tendrá el siguiente formato:

// Tiempo de espera cuando no se encuentra una tarea que ejecutar
$config['queue']['sleeptime'] = 1;

// Probabilidad (en %) de que se limpie una tarea antigua
$config['queue']['gcprop'] = 5;

// Timeout por defecto en que el shell espera por la ejecución de un trabajo
$config['queue']['defaultworkertimeout'] = 120;

// Número de reintentos si el trabajo falla o se ha alcanzado el timeout
$config['queue']['defaultworkerretries'] = 4;

// Tiempo (en segundos) después de que el shell ha terminado (0 = ilimitado)
$config['queue']['workermaxruntime'] = 0;

// Tiempo (en segundos) después de que los trabajos completados se eliminen de la base de datos
$config['queue']['cleanuptimeout'] = 3600;

3. Uso

Desde comando podemos utilizar el plugin para llevar a cabo determinadas acciones:

  • Help: para mostrar un mensaje de ayuda
    cake queue help
  • Add: intenta llamar a la función add() de una tarea, pues podría pasar que las tareas no permitan esta posibilidad.
    cake queue add <taskname>
  • Runworker: ejecuta un proceso  que comprueba la cola y ejecuta las tareas pendientes, eliminando las que hayan caducado.
    cake queue runworker

4. Tareas Instaladas

  • QueueEmail: tarea para insertar en la cola un email que se enviará utilizando el EmailComponent de CakePHP.

Podríamos crear nuestras propias tareas siguiendo la guía que se encuentra en el archivo cakephp_queue/vendors/shells/tasks/queue_example.php. Nosotros hemos adaptado, por ejemplo, la tarea queue_email.php para utilizar un componente distinto de envío de correo que mejora su funcionamiento y proporciona más opciones de configuración.

5. Uso

5.1 Añadir al modelo Queue.QueuedTask la lista de modelos que se van a utilizar

5.2 Crear los datos que se le van a pasar al email, será un array con la siguiente estructura:

* Settings: todas las opciones de configuración de envío del email.

* Vars: variables que se pasarán a la vista. La propia tarea se encargará de hacer un set, los sets realizados en la función del controlador no los tendrá en cuenta.

array (
   'settings' =>
      array (
        'to' => null,        'subject' => null,
        'charset' => 'UTF-8',
        'from' => null,
        'sendAs' => 'html',
        'template' => null,
        'debug' => false,
        'additionalParams' => '',
        'layout' => 'default'
),
'vars' =>
   array (
   ),
);

Ejemplo:

$email_data = array (
   'settings' =>
      array (
        'attachments' => [fichero_adjunto],
        'from' => [email_origen],
        'layout' => [layout],
        'subject' => [asunto],
        'template' => [template],
        'to' => [destinatario],
),
'vars' =>
   array (
      'asunto' => [asunto],
      'contenido' => [contenido],
      ... // Podríamos incluir tantas variables como consideremos necesario
      'fullBaseUrl' => FULL_BASE_URL, // Utilizaremos esta variable pues si utilizamos la propia de Cake en el template nos devolverá la ruta de la consola, no la de la aplicación
   ),
);

3. Llamamos a la función que añade la tarea a la cola

$this->QueuedTask->createJob('email', $email_data);

Ahora únicamente nos quedaría llamar al Runkworker como se comentó anteriormente y ya tendremos nuestra cola de tareas funcionando.

Deja una respuesta

[ bbPress synchronization by bobrik ]