<?xml version="1.0" encoding="UTF-8"?><!-- generator="bbPress" -->

<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

<channel>
<title>Dudas de cakephp &#187; Topic: CakePHP Queue Plugin</title>
<link>http://cakephp.hospedaxes.com/dudas/</link>
<description>Just another bbPress community</description>
<language>en</language>
<pubDate>Wed, 08 Feb 2012 22:29:54 +0000</pubDate>

<item>
<title>nuria en "CakePHP Queue Plugin"</title>
<link>http://cakephp.hospedaxes.com/dudas/topic/cakephp-queue-plugin#post-125</link>
<pubDate>Jue, 22 Apr 2010 07:50:37 +0000</pubDate>
<dc:creator>nuria</dc:creator>
<guid isPermaLink="false">125@http://cakephp.hospedaxes.com/dudas/</guid>
<description>&#60;blockquote&#62;&#60;p&#62;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 &#60;a title=&#34;CakePHP&#34; href=&#34;http://cakephp.org/&#34;&#62;Cake&#60;/a&#62;), hemos encontrado un plugin que debemos explicar, pues resulta verdaderamente interesante en casi cualquier &#60;a title=&#34;Hospedaxes&#34; href=&#34;http://www.hospedaxes.com&#34;&#62;proyecto de desarrollo&#60;/a&#62;, ¿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 &#60;a title=&#34;CakePHP Queue Plugin&#34; href=&#34;http://github.com/MSeven/cakephp_queue&#34;&#62;CakePHP Queue Plugin&#60;/a&#62; 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.&#60;/p&#62;
&#60;p&#62;Seguiremos la explicación que proporciona &#60;a title=&#34;MSeven&#34; href=&#34;http://github.com/MSeven&#34;&#62;MSeven&#60;/a&#62; en su web para ir comentando paso a paso cómo utilizar este plugin:&#60;/p&#62;
&#60;p&#62;&#60;strong&#62;1. Instalación&#60;/strong&#62;&#60;/p&#62;
&#60;p&#62;* Copiamos los ficheros proporcionados en la carpeta plugins&#60;/p&#62;
&#60;p&#62;* Ejecutamos el siguiente comando desde la consola de CakePHP (en &#60;em&#62;/cake/console&#60;/em&#62;/):&#60;/p&#62;
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;cake schema run create -path plugins/queue/config/sql -name queue&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;&#60;strong&#62;2. Configuración:&#60;/strong&#62;&#60;/p&#62;
&#60;p&#62;El plugin nos permite añadir un archivo de configuración personalizado (&#60;em&#62;app/config/queue.php&#60;/em&#62;), que tendrá el siguiente formato:&#60;/p&#62;
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;// 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;&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;&#60;strong&#62;3. Uso&#60;/strong&#62;&#60;/p&#62;
&#60;p&#62;Desde comando podemos utilizar el plugin para llevar a cabo determinadas acciones:&#60;/p&#62;
&#60;ul&#62;
&#60;li&#62;&#60;strong&#62;Help&#60;/strong&#62;: para mostrar un mensaje de ayuda
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;cake queue help&#60;/code&#62;&#60;/pre&#62;
&#60;/li&#62;
&#60;li&#62;&#60;strong&#62;Add&#60;/strong&#62;: intenta llamar a la función add() de una tarea, pues podría pasar que las tareas no permitan esta posibilidad.
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;cake queue add &#38;lt;taskname&#38;gt;&#60;/code&#62;&#60;/pre&#62;
&#60;/li&#62;
&#60;li&#62;&#60;strong&#62;Runworker&#60;/strong&#62;: ejecuta un proceso  que comprueba la cola y ejecuta las tareas pendientes, eliminando las que hayan caducado.
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;cake queue runworker&#60;/code&#62;&#60;/pre&#62;
&#60;/li&#62;
&#60;/ul&#62;
&#60;p&#62;&#60;strong&#62;4. Tareas Instaladas&#60;/strong&#62;&#60;/p&#62;
&#60;ul&#62;
&#60;li&#62;&#60;strong&#62;QueueEmail&#60;/strong&#62;: tarea para insertar en la cola un email que se enviará utilizando el &#60;a title=&#34;CakePHP API: Email Component&#34; href=&#34;http://api.cakephp.org/class/email-component&#34;&#62;EmailComponent&#60;/a&#62; de CakePHP.&#60;/li&#62;
&#60;/ul&#62;
&#60;p&#62;Podríamos crear nuestras propias tareas siguiendo la guía que se encuentra en el archivo &#60;em&#62;cakephp_queue/vendors/shells/tasks/queue_example.php&#60;/em&#62;. Nosotros hemos adaptado, por ejemplo, la tarea &#60;em&#62;queue_email.php&#60;/em&#62; para utilizar un componente distinto de envío de correo que mejora su funcionamiento y proporciona más opciones de configuración.&#60;/p&#62;
&#60;p&#62;&#60;strong&#62;5. Uso&#60;/strong&#62;&#60;/p&#62;
&#60;p&#62;5.1 Añadir al modelo &#60;em&#62;Queue.QueuedTask&#60;/em&#62; la lista de modelos que se van a utilizar&#60;/p&#62;
&#60;p&#62;5.2 Crear los datos que se le van a pasar al email, será un array con la siguiente estructura:&#60;/p&#62;
&#60;p&#62;* &#60;em&#62;Settings&#60;/em&#62;: todas las opciones de configuración de envío del email.&#60;/p&#62;
&#60;p&#62;* &#60;em&#62;Vars&#60;/em&#62;: 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.&#60;/p&#62;
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;array (
   'settings' =&#38;gt;
      array (
        'to' =&#38;gt; null,&#60;/code&#62;&#60;code&#62;        &#60;/code&#62;&#60;code&#62;'subject' =&#38;gt; null,
        'charset' =&#38;gt; 'UTF-8',
        'from' =&#38;gt; null,
        'sendAs' =&#38;gt; 'html',
        'template' =&#38;gt; null,
        'debug' =&#38;gt; false,
        'additionalParams' =&#38;gt; '',
        'layout' =&#38;gt; 'default'
),
'vars' =&#38;gt;
   array (
   ),
);&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;&#60;em&#62;Ejemplo:&#60;/em&#62;&#60;/p&#62;
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;$email_data = array (
   'settings' =&#38;gt;
      array (
        'attachments' =&#38;gt; [fichero_adjunto],
        'from' =&#38;gt; [email_origen],
        'layout' =&#38;gt; [layout],
        'subject' =&#38;gt; [asunto],
        'template' =&#38;gt; [template],
        'to' =&#38;gt; [destinatario],
),
'vars' =&#38;gt;
   array (
      'asunto' =&#38;gt; [asunto],
      'contenido' =&#38;gt; [contenido],
      ... // Podríamos incluir tantas variables como consideremos necesario
      'fullBaseUrl' =&#38;gt; 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
   ),
);&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;3. Llamamos a la función que añade la tarea a la cola&#60;/p&#62;
&#60;pre class=&#34;prettyprint&#34;&#62;&#60;code&#62;$this-&#38;gt;QueuedTask-&#38;gt;createJob('email', $email_data);&#60;/code&#62;&#60;/pre&#62;
&#60;p&#62;Ahora únicamente nos quedaría llamar al &#60;em&#62;Runkworker&#60;/em&#62; como se comentó anteriormente y ya tendremos nuestra cola de tareas funcionando.&#60;/p&#62;&#60;/blockquote&#62;
&#60;p&#62;&#60;br/&#62;&#60;a href=&#34;http://cakephp.hospedaxes.com/cakephp-queue-plugin&#34;&#62;CakePHP Queue Plugin&#60;/a&#62;&#60;/p&#62;</description>
</item>

</channel>
</rss>

