php缓存由php生成的html组件的功能实现

html组件一般包括js,css,图片,某些特定情况下,不是直接访问,而是通过php访问,这里描述如何缓存,并以图片举例。
缓存能稍许加快速度。
要注意:无论如何,这样操作一定比服务器直接返回图片慢不少,只适用于特定场合。
环境:linux apache2, php5.2.6,php.ini时区设好PRC
     假定/www/images/demo.jpg存在。

实现:
以下是1.html
<img src="1.php?img=demo.jpg" />



以下内容是1.php

$fullpath = '/www/images/' . basename($_GET['img']); //假定文件都在/www/images/下
if (!is_file($fullpath)) {
  header("HTTP/1.0 404 Not Found");
  exit();
}

$info = getImageSize($fullpath); //获取图片信息
if (!$info) {                    //如果不是图片
  header("HTTP/1.0 404 Not Found");
  exit();
}


// 以下凡是header函数都是在输出头部信息。较多。
header('Content-type: '. $info['mime']);          //类似于image/png
header('Content-Length: '. filesize($fullpath));  //文件长度

header('Pragma: ');                       //没用,但要设置,防止服务器生成no-cache的可怕字眼

//手动设置过期时间,单位都是秒
$validtime = 48* 60 * 60;    // 48小时

//缓存相对请求的时间,
header('Cache-Control: ' . 'max-age='. $validtime);          

//也很重要的Expires头,功能类似于max-age
//time()+$validtime: 设置期限,到期后才会向服务器提交请求
//gmdate,生成Sun, 01 Mar 2009 04:05:49 +0000  的字符串,而且是GMT标准时区
//preg_replace,  生成Sun, 01 Mar 2009 04:05:49 GMT,  注意:可能与服务器设置有关,但我都用默认设置
header('Expires: ' . preg_replace('/.{5}$/', 'GMT', gmdate('r', time()+ $validtime)));     

//文件最后修改时间
$lasttime = filemtime($fullpath);

//最后修改时间,只有设置了,点击刷新时,浏览器再次请求图片才会发出'IF_MODIFIED_SINCE'头,从而被php程序读取
header('Last-Modified: ' . preg_replace('/.{5}$/', 'GMT', gmdate('r', $lasttime) ));     

//重要,如果请求中的时间和 文件生成时间戳相等,则文件未修改,客户端可用缓存
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lasttime) {
  header("HTTP/1.1 304 Not Modified"); //服务器发出文件不曾修改的指令
  exit();
}

//如果文件被修改了,只好重新发出数据
echo file_get_contents($fullpath);


检验方法,用firefox的firebug看。多次刷新,如果图片返回304,则缓存成功。

你可能感兴趣的:(html,linux,PHP,Firebug,firefox)