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,则缓存成功。