Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Problemas cacheando desde http

Estas en el tema de Problemas cacheando desde http en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola Amigos, actualmente estoy trabajando en un proyecto que tiene mucho trafico, para solventar un poco la carga de cpu cacheo las scripts en un ...
  #1 (permalink)  
Antiguo 15/01/2008, 10:51
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Problemas cacheando desde http

Hola Amigos, actualmente estoy trabajando en un proyecto que tiene mucho trafico, para solventar un poco la carga de cpu cacheo las scripts en un archivo html.

Para optimizar un poco mas las cosas cree una clase llamada HttpCache que se encarga de aprovechar el cache del explorador de cada usuario, basicamente lo que hace es responder con la cabecera 304 not changed si el usuario tiene una copia en su computadora.

No se por que pero no funciona como debiera, nunca devuelve la cabecera 304

Por favor echenle un vistazo al codigo, al final les adjunto la forma de usarla;

Código PHP:
class HttpCache {
    private 
$lastModified;
    private 
$etag;

    public function 
setEtag($tag) {
        if (!isset(
$this->lastModified)) {
            
$this->etag=substr(md5($tag),0,15);
        } else {
            
$tag=$tag.gmdate('DdMYHis'$this->lastModified);
            
$this->etag=substr(md5($tag),0,15);
        }
    }
    
    public function 
setLastModifiedFromFile($file) {
        if (
file_exists($file)) {
            
$this->lastModified filemtime($file);
        } else {
            
$this->lastModified=now();
        }
            
    }

    public function 
sendHeaders() {

        
header('Cache-Control: private, must-revalidate');
        
header('Expires: ' gmdate("D, d M Y H:i:s"time() + 60*60*48) . ' GMT');
        
header('Last-Modified: '.gmdate('D, d M Y H:i:s'$this->lastModified).' GMT');
        
header('ETag: '.$this->etag);

        
$headers getallheaders();
        if((
$headers['If-None-Match'] == $this->etag )|| ($headers['If-Modified-Since'] == gmdate('D, d M Y H:i:s'$this->lastModified)) ){
            
header('HTTP/1.0 304 Not Modified');
            exit;
           } 

    }


Yo para probarlo creo el archivo prueba.php con el siguiente codigo;

Código PHP:
//incluyo el archico que tiene la clase HttpCache
require('Core/Control/HttpCache.php');

$cache= new HttpCache();
$cache->setLastModifiedFromFile('prueba.php');
$cache->setEtag('hola');
$cache->sendHeaders(); 

echo 
'<pre>';
print_r($cache);
echo 
'</pre>'
Buenos, espero que le echen un vistazo. Es un poco frustrante.

Saludos, Eugenio

Última edición por eugenioclrc; 15/01/2008 a las 11:20 Razón: correji un error en el codigo de ejemplo
  #2 (permalink)  
Antiguo 15/01/2008, 11:51
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Problemas cacheando desde http

Hola eugenioclrc

Ahí hay algo que me parece extraño... en la línea:
Código PHP:
if(($headers['If-None-Match'] == $this->etag )|| ($headers['If-Modified-Since'] == gmdate('D, d M Y H:i:s'$this->lastModified)) ){ 
Me parece que cuando un browser te envía el If-Modified-Since, lo que te manda es la fecha en la que él obtuvo el archivo en cuestión en un request anterior, sin embargo lo comparas con la última modificación real del archivo.

Creo que por eso es que no funciona, supongo que deberías verificar que si el If-Modified-Since es posterior a la fecha real de modificación, entonces es que tienes que enviar el 304
  #3 (permalink)  
Antiguo 15/01/2008, 18:19
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Re: Problemas cacheando desde http

Hola, creo que te equivocas, el If-Modified-Since devuelve lo que nosotros le servimos una vez con la cabecera Last-Modified
De todas formas ahi hay un or, asi que por mas que el If-Modified-Since no coincida, el If-None-Match deberia coincidir.

El problema es que nunca me devuelve el navegador los headers If-Modified-Since y If-None-Match


Saludos, Eugenio
  #4 (permalink)  
Antiguo 16/01/2008, 09:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Problemas cacheando desde http

Deberías de analizar si el navegador te envía esas cabeceras, ya que desconozco si sean parte del protocolo estándar HTTP enviar esas cabeceras..

Saludos.
  #5 (permalink)  
Antiguo 16/01/2008, 14:24
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Problemas cacheando desde http

Hmmm.... estuve revisando un poco la documentación y todavía no lo tengo claro.

Por qué no pones los headers que se envían y reciben en un par de requests consecutivos y cómo esperarías que fueran. Si usas Firefox, te recomiendo la extensión TamperData que te permite ver todo esto.
__________________
pragone
Blog: Desarrollo, comunidad y monetización
Últimos artículos: Tips de Smarty
  #6 (permalink)  
Antiguo 17/01/2008, 23:07
 
Fecha de Ingreso: noviembre-2007
Mensajes: 38
Antigüedad: 16 años, 5 meses
Puntos: 2
Re: Problemas cacheando desde http

Hola a todos, parece que ya descubri algo...

Al parecer no funcinaba cuando llamaba a la clase HttpCache para que mande los headers, y despues hacia lo siguiente;

Código PHP:
ob_start("ob_gzhandler");
echo 
$salida;
exit(); 
Ahora lo cambie por;

Código PHP:
        $out=str_replace("\n",' ',$out);
        
$out=ereg_replace('[[:space:]]+',' ',$out); 
        
$out gzencode($out,9); 
        
         
header('Content-Encoding: gzip');
        
header('Content-Length: ' strlen($out));
        
        echo 
$out;

        exit(); 
Donde $out es el codigo html a mostrar. Al parecer la clase HttpCache funciona correctamente. Yo la probe con Firebug y con LiveHTTP Headers, ambos plugins de Firefox.

Saludos, Eugenio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:51.