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 *

Invertir en criptomonedas: »

 

Cómo comprar bitcoin

Invertir y comprar Bitcoin y otras altcoins es más fácil de lo que crees.

1) Si sólo quieres comprar Bitcoin, Ethereum o Litecoin como inversión, tu opción es Coinbase

2) Si quieres probar con otras criptomonedas tu opción es Binance

3) Cualquier duda escríbeme con total libertad al formulario de contacto para resolver dudas: https://www.pedroventura.com/contacto/

¡Comparte este artículo! »

  • A.BTC (4 semanas)
    Canal Serio de Señales para Trading con Criptomonedas Enlace: https://t.me/tradingcriptomonedas
  • Margart (1 mes)
    La verdad que me ha gustado mucho el post, de…
  • ¡Hablan de nosotros! (2 meses)
    […] 04/02/2018          => Lee el artículo aquí…
  • Emiluz (2 meses)
    Camaradas... tengo documento de word con formulas nativas de word...…
  • Francisco (2 meses)
    Buen dia, agradeceria el envio del archivo. Saludos.
  • yaplog.jp (2 meses)
    I am genuinely glad to glance at this webpage posts…

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