entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Optimización en Cache Manual utilizando JSON y PHP

Hola comunidad, tengo mi sitio web con solamente 5 conexiones recurrentes a la Base de Datos, entonces comencé la Implementación de un Módulo que lo llamé Gandalf. me trabaja de la siguiente forma: para cada Seccion activa tengo una carpeta 'S'+#id_seccion y dentro de esta cada vez que inserto una noticia guardo en un fichero list_news.json un array codificado a json con valores sencillos para referencia rápida como son el id_news,titulo_news... y además de eso guardo la noticia nueva en un fichero llamado 'N'+#id_news entonces en esta mini db o cache como querais decirle, cuando voy a insertar una noticia borro completamente todo el contenido de la seccion activa para luego generrar todo el contenido lo cual es mala optimización por el tiempo si comparamos el otro metodo que sería generar el fichero de index y eliminar la noticia más vieja y insertar la nueva. O otra forma de optimizarlo. Saludos Dairon

0voto

carlossevi comentado

¿Puedes poner código? Entiendo que la solución más óptima sería añadir contenido al fichero listnews.json en lugar de volver a construirlo de cero.

0voto

dairon comentado

el código en sí es largo pero puedo poner el pseudo código es algo más rápido aunque en realidad lo que necesito es una idea de optimización. Saludos Dairon

0voto

carlossevi comentado

Da igual código, pseudocódigo o un diagrama de flujo pero lo que me falta por entender es si es una caché de escritura, lectura o ambos y dónde tienes el problema de rendimiento. Si es una caché, ¿tienes después un proceso que vuelca los datos a la BBDD o es que en realidad has sustituido la base de datos por almacenamiento en ficheros?

0voto

dairon comentado

Cadavez que inserto una nueva noticia hago una llamada a las ultimas 10 noticias en esas seccion y creo los ficheros antes mencionados. esta parte es de escritura.
Cuando accede un visitante entonces valido que la url-amiga que llegó si está en la lista de noticias en cache entonces no utilizo la base de datos sino que leo los datos de la noticia de mi cache de json y se la muestro al usuario, en caso de no estar en mi cache entonces hago la consulta a la base de datos para que me devuelva los datos de mi noticia.
Solo cacheo las noticias que se encuentran en el home de mi página y las 10 que serán listadas cuando algún visitante le de clic al menú de navegación para listar las noticias de una sección activa. esto me tiene que aliviar las conexiones a la base de datos en un gran porciento pues solo conectaría a la misma cuando algún usuario quiera ver una noticia de más de unos días lo cual es mucho más bajo dada la duración de las notocias en internet ;) Saludos

1 Respuesta

3votos

carlossevi Puntos63580

Permiteme que te haga una consulta, por curiosidad ¿Qué te ha hecho descartar el uso del caché de base de datos que implementa CodeIgniter? No lo he utilizado pero según su documentación también puede borrarse la caché filtrando por URI.

Aunque es interesante que te hayas construido tu propia caché seguramente al reinventar la rueda tu implementación tiene más probabilidades de ser menos eficiente (ojo, o no si te has centrado exclusivamente en tu necesidad en lugar de resolver una necesidad global).

Como aporte a tu desarrollo veo algo que me chirría un poco: ¿Puedes evitar el doble acceso a ficheros? Normalmente la escritura/lectura de ficheros en disco no es muy rápida. No veo imprescindible llevar un índice con las noticias cacheadas. Tu implementación:

  1. Recibir la URI
  2. Abrir fichero de URIs cacheadas, si existe el registro pasar a 3, si no pasar a 4
  3. Leer fichero de caché individual y construir página
  4. Leer BBDD y construir página

Puedes fusionar los pasos 2 y 3 en uno solo (con un solo acceso a disco) si el nombre del fichero de caché individual lo ligas a la URI. Suele hacerse con funciones de hash, como por ejemplo MD5 ya que aunque es un hash poco seguro se calcula muy rápido y en este caso no importa la seguridad. Quedaría:

  1. Recibir la URI, calcular el hash (ej. 572d4e421e5e6b9bc11d815e8a027112)
  2. Comprobar si existe el fichero 572d4e421e5e6b9bc11d815e8a027112.json en tu ruta de caché. Si existe, leer y construir página, si no, pasar al punto 3.
  3. Leer BBDD y construir página (y caché opcionalmente)

Espero que te sea de utilidad.

0voto

dairon comentado

La idea del hash es realmente rápida, cambiaré mi implementación, pero es que tengo también una opción de listar noticias por sección para la cual solamente necesito el {titulo, uri, foto_portada, descripcion} de una noticia por eso en el fichero de cada sección tengo una lista de noticias existentes.
No utilizo la cache de Codeigniter porque no quiero levantar la conexión a la base de datos que se cae muy rápido y me tumba la página, además me gusta más hacerla a mano así puedo optimizarla y configurarla a mi gusto, y también que cacheo otras cosas más que son variadas, distintos datos, a decir verdad todo lo que pueda por tal de no conectarme a la base de datos.

0voto

carlossevi comentado

Habría que ver el caso concreto pero supongo que lo que llamas "lista de noticias" también podrá ser cacheada con el mismo método del hash.

0voto

dairon comentado

Ahora pongo este código para leer la noticia en cache y no me funciona:

#abrir la noticia si existe en json
        $url_content  = '';        
        $noticia = '';  
        $file = fopen("../gandalf/".sha1($this->uri->segment(2))."/".sha1($this->uri->segment(3)), 'r');          
        if($file){  
            while(!feof($file)) {  
            $url_content .= fgets($file, 4096);              
            } 
        }    
        fclose($file);
        $noticia = json_decode($url_content);   

0voto

dairon comentado

Ya encontré el detalle. Faltaba la extención del fichero. Saludos Dairon

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta