15.21. Cache

15.21.1. CDN (Content Delivery Network) 与反向代理

与CDN有关的开发工作

15.21.1.1. CDN接口API

CDN 内容更新,一般厂商会提供一个SOAP接口,你可以通过接口刷新你的内容。但接口有限制,不能随意使用,一般是多少秒可以刷新一次,或者一天可以刷新几次

15.21.1.2. 方向代理页面过期处理

方向代理一般都支持PURGE协议,Squid,Varnish等等向管理端口发送 PURGE 即可是使用页面刷新

PURGE http://netkiller.github.net/index.html
				

有些方向代理如:Varnish 可以使用正则表达式

同时这些代理服务器都承受管理命令

squid: squidclient

varnish: varnishadm

15.21.1.3. 内容版本化

例如这样的URL

http://images.example.com/logo.gif
http://images.example.com/product.jpg
				

我们可以通过Rewrite或PATHINFO等技术做为静态化。例如首次版本

http://images.example.com/logo.1.gif		=> logo.gif
http://images.example.com/product.1.jpg		=> product.jpg
				

原图发生变化后,版本递增

http://images.example.com/logo.2.gif		=> logo.gif
http://images.example.com/product.2.jpg		=> product.jpg
				

就的URL将丢弃

http://images.example.com/logo.1.gif
http://images.example.com/product.1.jpg
				

CDN 就回源去下面的URL,并且取到的是新图

http://images.example.com/logo.2.gif
http://images.example.com/product.2.jpg
				

15.21.2. HTTP Cache

Cache-Control

max-age
max-age 格式写为:max-age=n,n是以秒为单位, 这个值是告知客户端GMT + N 后页面过期,缓存服务器在s-maxage值为空的时候也会使用这个参数的值。

s-maxage
s-maxage的格式跟max-age一样,只不过他是给缓存服务器使用的。

must-revalidate
这个参数用来告知客户端和缓存服务器,在GET请求的时候必须与源服务器验证实体是否为最新版本。

Cache-Control:max-age=1200,s-maxage=3600
			
Last-Modified
这个参数提供了实体最近一次被修改的时间。这个名字起得不错,当实体被修改了之后,这个参数也就会被修改.
			

ETag

ETag
ETag是根据内容生成的一段hash字符串,采用信息摘要算法,保证每一个页面有一个唯一字串。
			

expires

expires 是HTTP 1.0 中定义的,已经不能满足用户的需要在 HTTP 1.1 加入了max-age,建议使用 max-age替代expires

指令					含义
public				可以在任何地方缓存
private				只能被浏览器缓存
no-cache			不能在任何地方缓存
must-revalidate		缓存必须检查更新版本
proxy-revalidate	代理缓存必须检查更新版本
max-age				内容能够被缓存的时期,以秒表示
s-maxage			覆盖共享缓存的max-age设置
			

在Squid, Varnish, Apache, Lighttpd, Nginx 中都可是实现HTTP Cache-Control推送,每次修改都需要重新加载,不太灵活。

ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"

server.modules = (
...
"mod_expire",
...
)

$HTTP["url"] =~ "^/images/" {
expire.url = ( "" => "access 30 days" )
}
			

我喜欢自己控制TTL时间,且每个页面单独设置,可以随时调整设置。

15.21.2.1. 在程序中灵活操作 Cache-Control

在MVC框架中每个控制器下的方法都可以单独操作Cache

Class blog extend Controller{
	blog(){
		header('Cache-Control: max-age=28800');
	}
	list(){
		header('Cache-Control: max-age=3600');
	}
	details(){
		header('Cache-Control: max-age=160');
	}
}
				

你还可以封装到Controller中

Class blog extend Controller{
	blog(){
		this->cache('28800');
	}
	list(){
		this->cache('3600');
	}
	details(){
		this->cache('160');
	}
}
				

15.21.2.2. 非程序文件缓存处理

首先做一个Rewrite让程序接管所有图片请求

url.rewrite = ( "^/(.+)" => "/index.php/$1" )
				

然后程序通过PATHINFO取出图片URL

http://images.example.com/your/dir/test.jpg => http://images.example.com/index.php/your/dir/test.jpg
				

程序取出 /your/dir/test.jpg 设置 Content-type 并输出二进制流

详细参考

<?php
    // Test image.
    $images = '/test/foo.png';

    $headers = apache_request_headers();

    if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($images))) {
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($images)).' GMT', true, 304);
    } else {
        header('Content-Type: image/png');
        print file_get_contents($fn);
		if (file_exists($images)) {
			header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($images)).' GMT', true, 200);
			header("Cache-Control: max-age=3600, must-revalidate");
			header('Content-Length: '.filesize($images));
			header('Content-type: ' .mime_content_type($images));
			flush();
			readfile($images);
			exit;
		}
    }

javascript 文件也可以使用类似方法处理

	private function js($file){
		if (file_exists($file)) {
			header("Cache-Control: max-age=3600, must-revalidate");
			header('Content-type: text/javascript');
			flush();
			readfile($file);
			exit;
		}
	}

15.21.3. Cache 生存时间

你不必一开始加费劲心机去考虑这个值,当网站运行一段时间后,利用玩站流量数据作为参考,一步一地尝试调整。

原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

时间: 2024-10-10 00:41:33

15.21. Cache的相关文章

[Mon Feb 10 15:21:06 2014] [notice] child pid 7101 exit signal File size limit exceeded (25)

今天遇到的问题: LAMP的LOG里报如下错误. 然后IE和FIREFOX里显示连接被重置或是无法访问. 但自己建一个正常的PHP测试探针倒可以. 原来是PHP错误日志太多,无法写入LOG导致. [root@localhost logs]# tail error_log [Mon Feb 10 15:21:06 2014] [notice] child pid 7101 exit signal File size limit exceeded (25) [Mon Feb 10 15:21:06

15.13. Cache

Cache大体分为两种,一种是文件Cache,另一种是内存Cache.按应用划分,可以分为页面Cache和局部Cache 15.13.1. 页面缓存 页面缓存有三种实现方式: 反向代理 HTTP Header Template 层 页面cache的原理是推送HTTP协议头,修改网页过期时间. 15.13.2. 局部缓存 局部cache是可以将数组,序列化对象,字符串等等,分别cache,并设置ttl值(生存时间) 数据库与应用程序之间加一层Cache,性能将会大幅提升. 我们一般会把Cache封

【逻辑题目】1 3 6 10 15 21数列、求大神解答内容的问题!谢谢

问题描述 为啥网上有说这个数列是等差数列我怎么看都看不出是等差数列.我是数学白痴,求大神解答还有用Java怎么输出这样规律的数列或者大神给提一下细节.万分感谢!!!!! 解决方案 解决方案二:明显不是等差数列,每个的差都不相等.publicstaticintgetAn(intn){if(n==1){return1;}elseif(n==2){return3;}else{returngetAn(n-1)+n;}} 解决方案三:后一个减前一个得到的差是等差数列解决方案四:1.3.6.10.15.21

一周电商要闻10.15—21:双11混战

亿邦动力网汇总.解读每周电商大事,浓缩精编成[一周电商要闻]供您览阅 1.黄光裕或酝酿出售库巴:寄望"嫡系"电商 据报道,黄光裕对"嫡系"电商国美网上商城寄予厚望,"明确了国美网上商城的重要地位",而对收购的电商平台库巴购物网有可能对外出售,其电商"双品牌"战略或将被放弃.此后,双方高管均否认出售传闻. 查看全文 黄光裕 2.传申通拒收京东订单:顺丰圆通跟风 京东商城今日确认收到申通邮件,申通全网将停发到京东仓库的订单.京东已

MaxCompute UDF系列之身份证校验及15位身份证号码转换成18位

为了验证一些老证件上的身份证号码到底是不是本人,今天为大家提供一个15位身份证号码转换成18位的MaxCompute的UDF,下载地址见附件. 效果如下: MaxCompute UDF代码如下: /*** * 身份证号码构成:6位地址编码+8位生日+3位顺序码+1位校验码 * 验证15位,18位证件号码是否有效:15位号码将直接转为18位: * 校验身份证号码除了校验位是否为数值,校验省份.出生日期 * 校验位不正确的会被正确的替代 * 出生日期逻辑有效性,即是否1900年前出生,是否当前日期后

兰亭集势周一早盘大涨超15%

摘要: 查看最新行情 兰亭集势周一早盘大涨超15% 北京时间1月6日晚间消息, 兰亭集势 (NYSE: LITB )今日早盘大涨,涨幅一度接近20%,后有所回落.截至北京时间22:55,兰亭集势股价上涨1.24美元至  查看最新行情 兰亭集势周一早盘大涨超15% 北京时间1月6日晚间消息,兰亭集势(NYSE: LITB )今日早盘大涨,涨幅一度接近20%,后有所回落.截至北京时间22:55,兰亭集势股价上涨1.24美元至9.39美元,涨幅15.21%. 兰亭集势今日宣布,已经完成对美国社交电商网

对序列进行迁移时产生间断的原因

我们知道创建序列时,会有默认的或者指定的 n个值会cache到内存中,当数据库所在的服务器down 机或者迁移序列时,会发生序列丢失的问题.现在就第二种进行实验.这里并没有什么方法可以解决序列 间隔的问题,如果有,也请大家给以事例. yang@rac1>create sequence yang_seq ; Sequence created. yang@rac1>select yang_seq.nextval from dual;    NEXTVAL ----------          1

RSS 2.0 规范[翻译]

rss|规范 原文地址:http://blogs.law.harvard.edu/tech/rss  什么是RSS?  RSS是一种网页内容联合格式(web content sydication format).  它的名字是Really Simple Syndication的缩写.  RSS是XML的一种.所有的RSS文档都遵循XML 1.0规范,该规范发布在W3C网站上.  在一个RSS文档的开头是一个<rss>节点和一个规定的属性version,该属性规定了该文档将以RSS的哪个版本表示

PHP+jQuery+Ajax+Mysql实现发表心情功能

  我们在浏览网站文章或帖子后,需要表达自己浏览后的心情感受,在很多网站都提供了给用户发表心情的功能,通过这个功能可以直观统计分析文章或帖子的浏览者的心情感受数据.在本文中,您将了解到,如何实现通过点击心情图标,即刻发表自己的心情. 下载 http://bbs.php100.com/read-htm-tid-391083-ds-1.html  本文通过实例讲解使用PHP+jQuery+Ajax+Mysql相结合,实现了用户发表心情的功能,操作简单,实用性强,是一篇将WEB知识进行综合应用的文章,