Ver Mensaje Individual
  #22 (permalink)  
Antiguo 19/04/2006, 05:12
Avatar de uamistad
uamistad
 
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 19 años, 4 meses
Puntos: 1
CORRECCIÓN DE UN BUG DE LA FUNCIÓN


ENCONTRÉ UN ERROR EN UNA FUNCIÓN QUE PUSE ARRIBA Y QUE LLAMÉ cacheando() y escribo este post para corregirlo.

Lo que sucede es que cuando se solicitaba la página nuevamente, la función enviaba efectivamente un código 304, PERO no se enviaba nuevamente, junto con ese 304, EL DATO DE LAST-MODIFIED, puesto que la cabecera de LAST-MODIFIED la puse después de que envié el 304 y di exit.

Como resultado de ese error, sólo se envía un 304 la primera vez, pero si se solicita muchas veces más el documento, se enviará la información de last-modified una vez sí y una vez no, alternándose.

El bug se solucionan poniendo la cabecera de LAST-MODIFIED siempre, se envíe o no el código 304. Basta con ponerlas antes de de que llame al segundo IF.

Código PHP:
//
function cacheando($archivo){
             
$ultima_modificacion "";
             if(
file_exists($archivo)){

                  
//lo convierto a GMT (Mexico City)
                  
$timestamp_modif filemtime($archivo)+6*60*60;

                  
//lo ponemos en un string
                  
$ultima_modificacion date("D, d M Y H:i:s",$timestamp_modif)." GMT";
                 }
//end file_exists

             //si el archivo no existe, mensaje de error
             
else mensaje_final('badcache2');


             
header("Cache-Control: max-age=0, must-revalidate");
             
header("Pragma: no cache");
             
header("Last-Modified: $ultima_modificacion");

             
            
//si cabecera contiene una fecha y es igualita a la proporcionada
            
if($ultima_modificacion == $_SERVER['HTTP_IF_MODIFIED_SINCE']){
                 
//header("Location: http://www.google.com");
                 //exit;
                 
header("HTTP/1.1 304 Not changed");
                 exit;
                }
//end if
}//end function 
Sólo lo dejo por si alguien lee esto en el futuro.

AHORA SÍ, POR MÁS QUE SE LE PIQUE "F5" EL DOCUMENTO CARGARÁ CASI INSTANTÁNEAMENTE, PUES EL SERVIDOR, AL SABER QUE EL DOCUMENTO NO HAY CAMBIADO, SE NEGARÁ ROTUNDAMENTE A ENVIARLO DE NUEVO Y LE PEDIRÁ AL NAVEGADOR QUE LO TOME DE SU CACHÉ.
__________________
"Di no al Internet Explorer" -Proverbio Chino-