problema en CacheHelper, crea archivos de caché que pueden entrar en conflicto

problema en CacheHelper, crea archivos de caché que pueden entrar en conflicto

Hay un problema bastante serio tanto con el helper de Cache de cakephp como en algunos elementos del core de éste framework, en este caso mas en concreto con el cake/dispatcher.php

El problema que voy a comentar es que en mi aplicacion estoy usando el mismo desarrollo que he hecho en cake como base para diferentes sites,  mi site en España, para México,  Peru, etc… mi site, es decir, un site internacional, cargando contenidos geo localizados por dominio, hasta aquí sencillo, no hay mucha dificultad.

El problema reside cuando yo quiero cachear una página usando el helper de Cache.

*Este helper lo que hace es después de renderizar la vista sobre el layout guarda todo el html generado en la carpeta views. Esta funcionalidad está muy bien y hace que la aplicación sea mucho más rápida, de hecho es necesario que casi todas las aplicaciones que se hagan con cakephp vayan cacheadas por todos los medios posibles, tanto por la el tipo “File”, memcache, etc, pues este framework da mucha carga a la base de datos cuando se hacen relaciones  del tipo, belongsTo, hasMany,etc…

Como he explicado el helper genera un archivo de cache de la página que estamos viendo. Por ejemplo si estoy en www.dominio-a.com y genero la cache de la página principal y digamos que yo tengo un controller que se llama homes_controller.php para gestionar mi pagina principal se genera en la carpeta de cache views, un archivo llamado homes.php, y bueno hasta aquí sigue todo ok!

Pero que pasa cuando, como en mi caso, yo tengo www.dominio-b.com que funciona con la misma aplicación en cake, y quiero mostrar la home, el próximo usuario que entra en www.dominio-b.com, verá la página que previamente se ha generado con el helper de cache que está en otro idioma, o pertenece a los contenidos de otro país o lo que sea.

Esto ocurre porque en el archivo cake/dispatcher.php que es donde cake traduce la url que estamos solicitando a su correspondiente controlador-acción-parámetros y también despacha la solicitud creando los modelos apropiados y controladores.

También es donde se busca la cache correspondiente a la página-controlador que estamos solicitando, de manera que si estamos en la página principal y como en mi caso, yo tengo un controller llamado homes_controller.php para procesar la lógica y pintar la página principal, en este punto cakephp siempre va a servir la cache que tiene guardada para la página principal guardada en homes.php en la carpeta views dentro de cache. De manera que cakephp no sabe a quien pertenece homes.php si a www.dominio-a.com o a www.dominio-b.com

Haré un resumen de la secuencia del problema.

Setup

  • Layout
  • CacheHelper
  • Hosting multiples sites
    • Website A (http://www.dominio-a.com)
    • Website B (http://www.dominio-b.com)

Que ocurre:

  • Un usuario visita la página principal en el site A
    • Dispatcher comprueba  /app/tmp/cache/views/home.php, y no existe.
    • La vista se renderiza, CacheHelper genera /app/tmp/cache/views/home.php
  • Otro usuario visita la home del site B
    • Dispatcher comprueba  /app/tmp/cache/views/home.php, y existe!
    • Se sirve la cache perteneciente al site A al usuario que quiere ver la home del site B

Que es lo que se pretende:

  • Un usuario vista la home del site A
    • Dispatcher comprueba  /app/tmp/cache/views/website-a.com/home.php, y no existe!
    • La vista se renderiza, CacheHelper genera /app/tmp/cache/views/dominio-a.com/home.php
  • Un usuario visita la home del site B
    • Dispatcher comprueba /app/tmp/cache/views/website-b.com/home.php, y no existe!
    • La vista se renderiza, CacheHelper genera /app/tmp/cache/views/dominio-b.com/home.php

Todo esto se puede solucionar modificando el dispatcher.php, el helper de cache y creando un sistema de carpetas dentro de app/tmp/cache/

Lo primero es copiar cake/libs/view/helpers/cache.php a app/views/helpers/cache.php y realizar las siguientes modificaciones, para que guarde un prefijo con el nombre del HOST

$content = preg_replace("/(<\?xml)/", "<?php echo '$1';?>",$content);

$file .= $content;

$cache_prefix = strtolower(Inflector::slug($_SERVER['HTTP_HOST']));

if (!file_exists(CACHE . 'views' . DS . $cache_prefix)) {

if (mkdir(CACHE . 'views' . DS . $cache_prefix)) {

$cache = $cache_prefix . DS . $cache;

} else {

$cache = $cache_prefix.'-'.$cache;

$this->log('CacheHelper::__writeFile() could not create the directory '.CACHE . 'views' . DS . $cache_prefix);

}

} else {

$cache = $cache_prefix . DS . $cache;

}

return cache('views' . DS . $cache, $file, $timestamp);

}

}

En  cake/dispatcher.php realizar las siguientes modificaciones para que tenga en cuenta en el prefijo que hemos guardado, cuando hemos generado la cache con el helper.

}

$path = strtolower(Inflector::slug($path));

$cache_prefix = strtolower(Inflector::slug($_SERVER['HTTP_HOST']));

if (!file_exists(CACHE . 'views' . DS . $cache_prefix)) {

$path = $cache_prefix.'-'.$path;

} else {

$path = $cache_prefix . DS . $path;

}

$filename = CACHE . 'views' . DS . $path . '.php';

if (!file_exists($filename)) {

  1. Modified: cake/dispatcher.php
  2. ===================================================================
  3. — cake/dispatcher.php 2009-09-28 19:31:32 UTC (rev 21)
  4. +++ cake/dispatcher.php 2009-09-30 19:44:54 UTC (rev 22)
  5. @@ -685,6 +685,16 @@
  6. }
  7. $path = strtolower(Inflector::slug($path));
  8. +                       /**
  9. +                        * Addresses the dispatching aspect of ticket #2
  10. +                        */
  11. +                       $cache_prefix = strtolower(Inflector::slug($_SERVER[‘HTTP_HOST’]));
  12. +                       if (!file_exists(CACHE . ‘views’ . DS . $cache_prefix)) {
  13. +                               $path = $cache_prefix.‘-‘.$path;
  14. +                       } else {
  15. +                               $path = $cache_prefix . DS . $path;
  16. +                       }
  17. +
  18. $filename = CACHE . ‘views’ . DS . $path . ‘.php’;
  19. if (!file_exists($filename)) {
  20. Modified: cake/libs/view/helpers/cache.php
  21. ===================================================================
  22. — cake/libs/view/helpers/cache.php    2009-09-28 19:31:32 UTC (rev 21)
  23. +++ cake/libs/view/helpers/cache.php    2009-09-30 19:44:54 UTC (rev 22)
  24. @@ -296,6 +296,22 @@
  25. $content = preg_replace(“/(<\?xml)/”, “<?php echo ‘$1’;?>”,$content);
  26. $file .= $content;
  27. +
  28. +               /**
  29. +                * Addresses the cache saving aspect of ticket #2
  30. +                */
  31. +               $cache_prefix = strtolower(Inflector::slug($_SERVER[‘HTTP_HOST’]));
  32. +               if (!file_exists(CACHE . ‘views’ . DS . $cache_prefix)) {
  33. +                       if (mkdir(CACHE . ‘views’ . DS . $cache_prefix)) {
  34. +                               $cache = $cache_prefix . DS . $cache;
  35. +                       } else {
  36. +                               $cache = $cache_prefix.‘-‘.$cache;
  37. +                               $this->log(‘CacheHelper::__writeFile() could not create the directory ‘.CACHE . ‘views’ . DS . $cache_prefix);
  38. +                       }
  39. +               } else {
  40. +                       $cache = $cache_prefix . DS . $cache;
  41. +               }
  42. +
  43. return cache(‘views’ . DS . $cache, $file, $timestamp);
  44. }
  45. }

Tags de búsquedas:

misma aplicación diferentes dominios cakephp,cache cakephp conflit

Noticias relacionadas »

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

  • marcelino (3 días)
    Os dejo un grupo donde opera uno de los trader…
  • Pedro Ventura (2 semanas)
    Hola Pablo, Creo que puedes configurar los códigos de adsense…
  • Pedro Ventura (2 semanas)
    Buenas, El proveedor cierra facturación el día 10 de cada…
  • pedro (4 semanas)
    Hola pero este sitio paga o no paga , ya…
  • Pedro (1 mes)
    Buenos días Margherita El plugin está obsoleto y ya no…
  • Juan Carlos Díaz (1 mes)
    Este grupo de Telegram me ha dado muy buenas señales…

Suscríbete al newsletter »

Proporciona tu correo electrónico a continuación y recibe las últimas noticias! Funciona con Feedburner de Google

Archivo »

Leer entrada anterior
crear un sitemap para videos

Si queréis crear un sitemap para que Google puede indexar mejor vuestros vídeos el siguiente ejemplo de estructura de sitemap...

Cerrar