una recargar que página pagina navegadores navegador los limpiar hacer evitar con como chrome caché cache borrar aplicación almacene actualizar php html image caching

php - recargar - no cache html5



¿Cómo hacer que el navegador guarde en caché las imágenes con PHP? (5)

Soy totalmente nuevo en la forma de almacenar imágenes en caché.

Salí todas las imágenes en una galería con PHP, y quiero que las imágenes ya mostradas, sean almacenadas en caché por el navegador, por lo que el script PHP no tiene que mostrar la misma imagen nuevamente. Todo lo que quiero es que las imágenes aparezcan más rápido.

Cuando llamo a una imagen, me gusta esto:

<img src="showImage.php?id=601">

y el showImage.php showImage.php hace:

$id = (int) $_GET[''id'']; $resultat = mysql_query(" SELECT filename, id FROM Media WHERE id = $id "); $data = mysql_fetch_assoc($resultat); ... //Only if the user are logged in if(isset($_SESSION[''user''])){ header("Content-Type: image/jpeg"); //$data[''filename''] can be = dsSGKLMsgKkD3325J.jpg echo(file_get_contents("images/".$data[''filename'']."")); }


Aquí hay un código que uso para el soporte de encabezado 304:

/** * @return false if not cached or modified, true otherwise. * @param bool check_request set this to true if you want to check the client''s request headers and "return" 304 if it makes sense. will only output the cache response headers otherwise. **/ protected function sendHTTPCacheHeaders($cache_file_name, $check_request = false) { $mtime = @filemtime($cache_file_name); if($mtime > 0) { $gmt_mtime = gmdate(''D, d M Y H:i:s'', $mtime) . '' GMT''; $etag = sprintf(''%08x-%08x'', crc32($cache_file_name), $mtime); header(''ETag: "'' . $etag . ''"''); header(''Last-Modified: '' . $gmt_mtime); header(''Cache-Control: private''); // we don''t send an "Expires:" header to make clients/browsers use if-modified-since and/or if-none-match if($check_request) { if(isset($_SERVER[''HTTP_IF_NONE_MATCH'']) && !empty($_SERVER[''HTTP_IF_NONE_MATCH''])) { $tmp = explode('';'', $_SERVER[''HTTP_IF_NONE_MATCH'']); // IE fix! if(!empty($tmp[0]) && strtotime($tmp[0]) == strtotime($gmt_mtime)) { header(''HTTP/1.1 304 Not Modified''); return false; } } if(isset($_SERVER[''HTTP_IF_NONE_MATCH''])) { if(str_replace(array(''/"'', ''"''), '''', $_SERVER[''HTTP_IF_NONE_MATCH'']) == $etag) { header(''HTTP/1.1 304 Not Modified''); return false; } } } } return true; }


En primer lugar, si está utilizando sesiones, debe desactivar session_cache_limiter (configurándolo en none o public ). Los encabezados que envía son bastante malos para los cachés.

session_cache_limiter(''none'');

A continuación, envíe Cache-Control: max-age= number_of_seconds y, opcionalmente, un equivalente Expires: header.

header(''Cache-control: max-age=''.(60*60*24*365)); header(''Expires: ''.gmdate(DATE_RFC1123,time()+60*60*24*365));

Para obtener la mejor capacidad de almacenamiento en caché, envíe el encabezado Last-Modified y responda con el estado 304 y el cuerpo vacío si el navegador envía un encabezado If-Modified-Since .

header(''Last-Modified: ''.gmdate(DATE_RFC1123,filemtime($path_to_image)));

Para abreviar, estoy haciendo trampa aquí un poco (el ejemplo no verifica la fecha), pero es válido siempre y cuando no le importe a los navegadores mantener el archivo en caché para siempre:

if (isset($_SERVER[''HTTP_IF_MODIFIED_SINCE''])) { header(''HTTP/1.1 304 Not Modified''); die(); }


Por favor, las imágenes de direcciones no son algunos recursos id''ed. utilice las URL absolutas para las imágenes, preferiblemente en un subdominio, preferiblemente menos cookies. El navegador hará el almacenamiento en caché de las imágenes. Un buen truco para cargar imágenes más rápido en los sitios web es colocarlo en algún CDN u otro sitio. Esto porque los navegadores limitan el número de subprocesos de solicitud paralelos a un dominio.

Otra buena manera de trabajar con imágenes es el sprite, búscalo. Ahorra mucho ancho de banda y también solicitudes.

También puede usar carga directa de mapa de bits si la velocidad es tan crucial. Sin embargo, esto no se recomienda para imágenes grandes. Si sus iconos y pequeñas imágenes / gifs que está cargando. Puede usar mapas de bits directamente en la página.


Puede almacenar las imágenes generadas en un directorio llamado "showImage" para que las incruste de esta manera

<img src="showimage/601.jpg" />

A continuación, coloca un archivo .htaccess en el mismo directorio que llamará a showImage.php? Id = en caso de que el archivo no exista, por ejemplo:

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)/.jpg$ showImage.php?id=$1 [QSA,L] </IfModule>

Simplemente lea en su comentario que desea hacer el caché del lado del cliente: simplemente configure los encabezados HTTP relacionados con el caché según http://www.mnot.net/cache_docs/


Si está utilizando php para verificar si el usuario ha iniciado sesión antes de enviar el mensaje, entonces no desea que el navegador guarde en caché la imagen.

El objetivo de todo el almacenamiento en caché es llamar al servidor una vez y luego nunca volver a llamarlo. Si el navegador almacena en caché la imagen, no llamará al servidor y su secuencia de comandos no se ejecutará. En cambio, el navegador extraerá su imagen de la memoria caché y la mostrará, incluso si el usuario ya no está conectado. Esto podría ser un agujero de seguridad muy grande.