If images which are retrieved on the browser side get cached, it can often speed up the time it takes for a page to load. This helps a lot on my forum, where people post a lot of picture.
I changed the following at the end of src/getFile.php.t:
header('Content-Type: '.$r[0]);
header('Content-Disposition:'.$append.'filename="'.$r[1].'"');
header('Content-Length: '.array_pop($r));
@readfile($r[2]);
to this:
if ($r[0]=="image/jpeg" || $r[0]=="image/png" || $r[0]=="image/tiff")
{
$size = getimagesize($r[2]);
if ($size[0]>800) system("mogrify -resize 800 ".$r[2]);
$headers = apache_request_headers();
// Checking if the client is validating his cache and if it is current.
if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($r[2]))) {
// Client's cache IS current, so we just respond '304 Not Modified'.
$expires = 60 * 60 * 24 * 30;
$exp_gmt = gmdate("D, d M Y H:i:s", time() + $expires )." GMT";
//header("Expires: {$exp_gmt}");
header("Cache-Control: public, max-age={$expires}");
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($r[2])).' GMT', true, 304);
} else {
//Image not cached or cache outdated, we respond '200 OK' and output the image.
$expires = 60 * 60 * 24 * 30;
$exp_gmt = gmdate("D, d M Y H:i:s", time() + $expires )." GMT";
header("Cache-Control: public, max-age={$expires}");
header("Expires: {$exp_gmt}");
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($r[2])).' GMT', true, 200);
header('Content-Length: '.filesize($r[2]));
header('Content-Disposition: '.$append.'filename="'.$r[1].'"');
header('Content-Type: '.$r[0]);
print file_get_contents($r[2]);
}
} else {
header('Content-Type: '.$r[0]);
header('Content-Disposition: '.$append.'filename="'.$r[1].'"');
header('Content-Length: '.array_pop($r));
@readfile($r[2]);
}
Now if I re-load a page containing an image which I have already downloaded, I do not have to re-load it.
Note that if your php is NOT running as an apache mod, you will not have the apache_request_headers() function - in which case, you also need to add this code:
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
$arh = array();
$rx_http = '/\AHTTP_/';
foreach($_SERVER as $key => $val) {
if( preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// do some nasty string manipulations to restore the original letter case
// this should work in most cases
$rx_matches = explode('_', $arh_key);
if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach($rx_matches as $ak_key => $ak_val ) $rx_matches[$ak_key] = ucfirst( $ak_val);
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
return( $arh );
}
I think this sort of cache-control would be a good addition to FUDforum.
cheers.