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

本文介绍了一种使用PHP进行图片缓存的方法,该方法适用于特定场景,并能够显著提高加载速度。文章详细解释了如何配置HTTP头部信息以实现有效缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,则缓存成功。
[img]/upload/attachment/79484/bbee3971-7d95-3056-bafc-61721e717324.jpg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值