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