Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/01/2008, 10:51
eugenioclrc
 
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