eZ Publish - Un blog

Creando y cacheando un rss con eZ Publish y eZ Components.

Sábado, 11 de Abril de 2009 - Carlos Revillo

eZ Publish tiene un módulo dedicado a la creación de rss, bastante completo y fácil de usar, pero que no siempre se ajusta a nuestras necesidades. El módulo se basa en la selección de un nodo "padre" de cuyos nodos hijos se sacarán una serie de atributos que formarán los items del rss. Esto sirve en la mayoría de los casos, pero hay veces en los que las especificaciones del proyecto hacen necesario filtrar de alguna forma los elementos que van a poder formar parte del rss.

En estos casos se hace necesaria la creación de una extensión que permita este filtrado y se encargue de forma este rss, ya sea gracias a clases externas o bien aprovechando las propias funcionalidades del framework de eZ Publish. Para esta ocasión vamos a usar dos de los componentes ofrecidos por eZ Components, en concreto el componente Feed y el componente Cache.
Como ejemplo vamos a crear un rss con los posts aparecidos en este blog. Para ello utilizaremos 3 cosas.

  1. Una de las clases del Framework de eZ Publish para sacar de forma sencilla los elementos que van a formar parte del rss.
  2. El componente Feed para la creación del rss.
  3. El componente Cache para no cargar la base de datos cada vez que alguien nos pida el rss.

Vamos con el ejemplo. Empezamos con la consulta que sacará los 10 últimos posts del blog. El 224 es el número del nodo bajo el que están estos posts.

$items = eZContentObjectTreeNode::subTreeByNodeId( 
      array( 
        "ClassFilterType" => "include",
        "ClassFilterArray" => array( "blog_post" ),
        "Limit" => 10,
        "SortBy" => array( "published", false )
      ), 224
 
  );

Para esto utilizamos uno de los métodos de una de las clases del framework de eZ Publish. Sería un tanto complicado hacerlo programando nuestra propia consulta. Como curiosidad, podéis activar vuestros debugs para ver que la consulta necesaria ocupa varias líneas.
A partir de aquí, empezamos con la construcción de nuestro feed.

$feed = new ezcFeed();
 
  $feed->title = 'Los posts de un blog sobre ez';
  $feed->description = 'El resumen de los posts de este blog';
  $feed->published = gmdate( 'D, d M Y H:i:s', time() ) .' GMT';
 
  $author = $feed->add( 'author' );
  $author->name = 'Tanta Tecnología y Comunicación';
  $author->email = 'info@tantacom.com'; 
 
  $link = $feed->add( 'link' );
  $link->href = 'http://unblogsobreez.com/'; 
 
  foreach ( $items as $node )
  {
    $data = $node->dataMap();
 
    //sacamos el título
    $title = $data["title"]->content();
 
    //sacamos el cuerpo
    $body = $data["body"]->content();
    $outputHandler = $body->attribute( 'output' );
    $bodyText = substr( $outputHandler->attribute( 'output_text' ), 0, 400 ) . "...";
 
    //creamos y añadimos el elemnto al rss
    $item = $feed->add( 'item' ); 
    $item->title = $title;
    $item->description = $bodyText;
    $item->published = gmdate( 'D, d M Y H:i:s', $node->ContentObject->Published ) .' GMT';
 
    $author = $item->add( 'author' );
    $author->name = 'Carlos';
    $author->email = 'carlos.revillo@tantacom.com';
 
    $link = $item->add( 'link' );
    $link->href = "http://" . $_SERVER["HTTP_HOST"]. "/" . $node->urlAlias(); 
  }
  $xml = $feed->generate( 'rss2' );

Listo, tenemos el feed montado. Los que hayáis trabajado con eZ Publish podréis notar que necesitaremos mucho menos código que con este. Como añadido, deciros que este mismo código necesitaría muy pocas modificaciones para funcionar con Drupal o con una aplicación a medida.

Pero supongamos que estamos manejando un sitio de bastante popularidad y que cada día, más y más usuarios se suscriben a nuestro rss. Hay que tener cuidado con esto, ya que este tipo de tráfico no es detectado por herramientas como Google Analytics y sin embargo, fuerzan la máquina tanto como una petición a un listado. La diferencia es que además, los usuarios suelen tener sus lectores de correo abiertos, con sus feeds configurados. Estos programas hacen peticiones de forma automatica para detectar posibles cambios en el rss. Cuando muchos usuarios hacen lo mismo los problemas de rendimiento pueden aparecer.

Para paliarlo tenemos la opción de usar el componente Cache. Siguiendo el tutorial es muy sencillo establecer un tiempo de validez para nuestro rss cacheado. Cuando ese tiempo pase, volveremos a consultar a la base de datos. Mientras tanto, el rss será servido desde un archivo guardado en disco, dejando libre a la base de datos. Este tiempo de vida es configurable. En nuestro ejemplo vamos a darle un tiempo de vida de 1 hora. Como siempre, estamos buscando un equilibrio entre rendimiendo e inmediatez de actualizaciones.

$options = array(
 'ttl' => 60*60*24,
);
 
ezcCacheManager::createCache( 'blog', $_SERVER['DOCUMENT_ROOT'].'/var/cache/', 'ezcCacheStorageFilePlain', $options );
 
$cache = ezcCacheManager::getCache( 'blog' ); 
 
$myId = 'feedsBlogs'; 
 
 
 
if ( ( $xml = $cache->restore( $myId ) ) === false )
{
//generar rss
$cache->store( $myId, $xml ); 
}

Os remitimos al tutorial del componente cache, para más información. Básicamente, lo que se hace es definir un tiempo de vida para este cache (ttl). Seguidamente, se crea el cache, el cual se guardará en la carpeta /var/cache de nuestra instalación de eZ Publish. Con la variable myId definimos el nombre del fichero donde quedará guardado. Por útimo, el método restore se encargará de determinar si el ttl ya ha sido superado. En este caso devolverá false, y empezará el proceso que hemos explicado arriba. En caso contrario, devolverá en la variable xml el contenido del fichero /var/cache/feedsBlogs.

Al igual que con los feeds, con muy ligeras modificaciones, podemos utilizar este componente para crear caches en Joomla o en cualquier otro CMS.

Puedes descargarte el código completo de nuestro script.

Entradas relacionadas

No hay ningún comentario

Deja un comentario:

  • eZHumanCAPTCHACode