【开发必知】基本缓存概念
来源:互联网 发布:跳舞吧软件下载 编辑:程序博客网 时间:2024/05/17 09:00
文章来源:PHP开发学习门户
地址:http://www.phpthinking.com/archives/567
1、客户端缓存
<meta>标签,这是进行页面缓存最基本的方法。
1
<meta http-equiv=
"expires"
content=
"Mon, 25 Feb 2014 00:00:00 GMT"
/>
2
<meta http-equiv=
"pragma"
content=
"no-cache"
/>
发送到浏览器的HTML页面中的meta标签告诉浏览器页面的缓存时间以及是否启用缓存等,programa:no-cache内容并不是保证,但大多数浏览器都遵从这个约定。
更好的方法是使用header函数,发送http头。
1
<?php
2
header(
'Expires: Mon, 25 Feb 2014 00:00:00 GMT'
);
3
header(
'Pragma: no-cache'
);
4
?>
可以进一步使用HTTP1.1版本的Cache-Control头:
1
<?php
2
header(
'Expires: Mon,25 Feb 2014 00:00:00 GMT'
);
3
header(
'Cache-Control: no-store, no-cache, must-revalidate'
);
4
header(
'Cache-Control: post-check=0, pre-check=0'
, FALSE);
5
header(
'Pragma: no-cache'
);
6
?>
上述方法存在的问题是浏览器必须下载页面读取meta标签,浏览器第一次请求页面时,如果不存在标签就会继续下载源文件的缓存拷贝。如果浏览器与服务器之间存在缓存的代理服务器,那么浏览器就可能得到过时的页面。同时,使用HTTP协议进行缓存控制并不是并不能完全保证,Cache-Control和Pragam只是为了保险而添加,同时Expires头可能因为客户端计算机的日期设置错误而失效。
为了更好控制客户端缓存,可以根据客户端的请求来判断,用到的是Last-Modified和If-Modified-Since头,这种行为称为执行一个有条件的GET请求。
这种方法要求每次访问PHP文件时候都要发送Last-Modified头,浏览器下次请求页面时发送包含一个更新时间的If-Modified-Since头,脚本判断从这个时间之后是否更新了页面内容。没有更新就返回一个304状态码后退出。
01
<?php
02
...
//get the filemtime
03
header(
'Last-Modified: '
.
gmdate
(
'D, d M Y H:i:s'
,
$lastFilemtime
).
' GMT'
);
04
05
$request
=
getallheaders
();
06
if
(isset(
$requeset
[
'If-Modified-Since'
]))
07
{
08
$modifiedSince
=
explode
(
';'
$request
[
'If-Modified-Since'
]);
09
$modifiedSince
=
strtotime
(
$modifiedSince
[0]);
10
}
11
else
12
{
13
$modifiedSince
= 0;
14
}
15
if
(
$lastModified
<=
$IfModifiedSince
)
16
{
17
header(
'HTTP/1.1 304 Not Modified'
);
18
exit
();
19
}
20
....
//output content
21
?>
2、服务器端缓存——使用php的输出缓冲
php内置的缓存机制是输出缓冲器。当使用echo或者print的情形,可以使用输出控制函数(以ob开头)将内容存储在内存缓冲器中。
首先可以将请求的页面在输出前,存储在缓冲器中,如果页面出现了错误,可以隐藏错误而不被访问者看到。
其次可以将输出缓冲器的内容存储到一个文件中,在下一次请求时判断修改时间然后没有过期的话就直接输出文件而提高网站的访问性能。这也是进行动态网站静态缓存的非常好的实现方式。
01
<?php
02
if
(file_exist(
'./cache.page'
) &&
$lasttime
>=
filemtime
(
'./cache.page'
) )
03
{
04
readfile(
'./cache.page'
);
05
exit
;
06
}
07
08
ob_start();
09
echo
<<<EOT
10
.......
11
.......
12
EOT;
13
14
$buffer
= ob_get_contents();
15
ob_end_flush();
16
17
$fp
=
fopen
(
'./cache.page'
,
'w'
);
18
fwrite(
$fp
,
$buffer
);
19
fclose(
$fp
);
同时,使用这种方法可以将页面中额某些不常改变的部分缓存到不同的文件中,然后在请求的时候组装整个页面来返回响应。
- 【开发必知】基本缓存概念
- 基本缓存概念
- Web开发ABC:初学者必知的26个概念和技术
- 学防火墙必知的几个概念
- 学习java必知的概念
- storm几个必知的概念
- 学习java必知的概念
- 缓存概念
- 缓存概念
- 缓存概念
- 开发b/s系统必知 网站开发必知
- web开发必知工具
- phpcms v9 模块开发基本教程。。。。。新手必看
- ios开发APP必须要了解的基本配置
- Java中的基本数据类型-技术人员必知
- 开发者必知的git基本命令
- linux基本的概念-不带缓存(带缓存)、POSIX标准、ANSIC标准
- 开发者必知的KPI概念和用法
- chrome的常用扩展
- 【OC加强】枚举介绍、数组的排序、对象的排序、如何利用block排序以及一些数据类型知识
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- Ubuntu宽带拨号连接设置
- HTML
- 【开发必知】基本缓存概念
- 做个环保主义的程序员
- tcp PUSH 标志的理解
- uboot移植过程中的运行地址和装载地址的区别
- /etc/bash.bashrc、/etc/profile、终端 设置
- 第七周项目三 求两数正差值
- 10月1,我与“传销”组织面对面
- 引入jquery的方法
- MVC过滤器使用案例:统一处理异常顺道精简代码