2009-03-16 25 views
7

Envío de solicitudes AJAX GET a una aplicación PHP y me gustaría almacenar las solicitudes en caché para su uso posterior.Solicitudes AJAX de caché

Dado que estoy usando GET, esto debería ser posible porque diferentes solicitudes solicitan URL diferentes (por ejemplo, getHTML.php? Page = 2 y getHTML.php? Page = 5).

¿Qué encabezados necesito declarar en la aplicación PHP para hacer que el caché del navegador del cliente sea el contenido de la URL de solicitud de manera adecuada? ¿Debo declarar algo en el Javascript que maneja la solicitud AJAX (estoy usando la función $ .ajax de jQuery que tiene un parámetro de caché)?

¿Cómo manejaré las ediciones que cambian el contenido de, p. getHTML.php? page = 2 para que el cliente no recurra a la versión en caché? Agregar otro parámetro a la solicitud GET, p. getHTML.php? page = 2 & version = 2 no es posible porque el enlace a la URL solicitada se crea automáticamente sin ninguna verificación (que es preferiblemente de la manera que yo quiero).

¿Cómo reaccionará el navegador cuando intente AJAX, solicite una URL de solicitud en caché? ¿La solicitud AJAX devolverá el éxito de inmediato?

Gracias

Willem

Respuesta

3

Una vez que actualiza la página, usted todavía será realizar llamadas de servidor para el contenido, a pesar de que los haya solicitado antes. Los encabezados de PHP no lo ayudarán con eso.

Creo que lo que necesita es un mecanismo de almacenamiento en caché del lado del cliente del contenido ya solicitado del servidor en la página actual.

Para este caso de uso, puede usar una tabla hash en JavaScript y consultarla antes de realizar una llamada al servidor. Esto mejorará la experiencia del usuario ya que el usuario no tendrá que esperar otra solicitud de contenido que ya haya visto.

He aquí un ejemplo:

//placeholder for hash table as cache 
var cache = []; 

var getPage = function(pageNr){ 
    if(cache[pageNr]){ 
     //content is already in cache, use it from there 
     handleContent(cache[pageNr]); 
    } 
    else{ 
     //object with parameteres sent with GET request 
     var params = {}; 
     params.page = pageNr; 

     $.ajax({ 
      url: "getHTML.php", 
      data: params, 
      cache: false, 
      success: function(response){ 
      //handle your response here 
      handleContent(response); 

      //store the response in the cache for later use 
      cache[pageNr] = response; 
      } 
     }); 
    } 
}; 

páginas solicita ahora buscará primero en la caché actual para ver si tiene el contenido. De lo contrario, hará que el servidor llame y almacene la respuesta en el caché.

Es similar a la experiencia de usuario al desplazarse a través de noticias en Google Finance

en cuenta que si se actualiza la página se borrará esta caché.

En caso de modificaciones en una página, deberá utilizar los enlaces de Maurice Perry a Yahoo Exceptional Performance para garantizar que su servidor siempre devuelva su última versión del contenido.

Más sobre tablas hash en JavaScript: http://www.mojavelinux.com/articles/javascript_hashes.html

+0

Esto creará un caché bastante grande [] eventualmente. Esta es la razón por la que esperaba poder utilizar los encabezados de PHP para usar el caché del navegador incorporado (que probablemente no afectará el rendimiento tanto como lo haría un gran conjunto de JS. – Willem

+0

A menos que esté planeando usar esto como un solo aplicación, el objeto de caché no debe ser excesivamente grande. Cuando lo haga, recuerde que todavía está almacenado en el cliente, en el navegador del usuario. En cualquier caso, puede elegir enjuagarlo cuando llegue a cierto punto. –

+0

I De hecho, estoy haciendo una "aplicación" de una sola página. ¿Estás seguro de que está bien almacenar objetos tan grandes en el cliente? – Willem

9

Añadir los siguientes encabezados en el servidor:

header("Cache-Control: private, max-age=$seconds"); 
    header("Expires: ".gmdate('r', time()+$seconds)); 

Dónde $ segundos tiene un significado obvio.

Además, verifique si su servidor no emite otros encabezados anti-caché como Pragma.Si es así, agregue también el encabezado "Pragma: caché".

+0

+1 para usar los encabezados http correctos. – goat

Cuestiones relacionadas