PHPahjesus 前端缓存原理 转载

PHP 1

LAMP缓存图

起图备受我们好见见网站缓存主要分为五部分

服务器缓存:主要是因web反为代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模

浏览器缓存:包括页面html缓存和图片js,css等资源的缓存

PHP缓存:有成百上千免费之PHP缓冲加速工具,如apc eaccerlertor等

外存缓存:主要是采用memcache这种分布式缓存机制

数据库缓存:通过配备数据库缓存,以及数据存储过程,连接池技术等

脚要介绍浏览器缓存原理:

PHP 2

打高达图:我们可了解浏览器缓存重要分为两只有:

页面html的复苏存图片,css,js,flash等缓存浏览器缓存是因把页面信息保存到用户本地电脑硬盘里。

服务器缓存是依据把用户访问的页面保存到服务器上之硬盘里。

页面缓存的原理

页面缓存状态是出于http
header决定的,一个浏览器请求信息,一个凡是服务器响应信息。主要概括Pragma:
no-cache、Cache-Control、 Expires、
Last-Modified、If-Modified-Since。其中Pragma:
no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1确定。

PHP 3

起图中我们得望原理主要细分三步:

率先次等呼吁:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向服务器请求,此时服务器记录第一次于呼吁的Last-Modified/Etag再次伸手:

当浏览器还要的时候,附带Expires,Cache-Control,If-Modified-Since/Etag向服务器请求

服务器根据第一浅记录之Last-Modified/Etag和重新伸手的If-Modified-Since/Etag做对比,判断是否要更新,然后响应请求。

相关参数说明:

Cache-Control的主要参数 Cache-Control: private/public Public
响应会让缓存,并且以差不多用户中共享。 Private
响应只能够作为个人的缓存,不可知重新用户中共享。

Cache-Control: no-cache:不进行缓存

Cache-Control: max-age=x:缓存时间 以秒为单位

Cache-Control: must-revalidate:如果页面是逾期的 则失去服务器进行获取。

Expires:显示的设置页面过期时

Last-Modified:请求对象最后一软的改时间 用来判定缓存是否过期
通常由服务器上文件之流年信息来。

If-Modified-Since :客户端发送请求附带的音讯
指浏览器缓存请求对象的最后修改日期
用来和劳动器端的Last-Modified做比。

Etag:ETag是一个可以
与Web资源事关的符号(token),和Last-Modified功能才未多,也是一个标识符,一般与Last-Modified一起用,加强服务器判断的准确度。

 

转载自 http://www.vicenteforever.com/2012/05/web-front-cache/

 

 

附代码:

PHP 4PHP 5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Configuration;

namespace __System.Web
{
    public class MyHttpModule : IHttpModule
    {
        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
            context.EndRequest += new EventHandler(context_EndRequest);
        }

        void context_EndRequest(object sender, EventArgs e)
        {
            ChangeCache(sender);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            //HttpApplication application = (HttpApplication)sender;
            //HttpContext context = application.Context;
            //string filePath = context.Request.FilePath;
            //string fileExtension = VirtualPathUtility.GetExtension(filePath);
            //if (fileExtension.Equals(".html") || fileExtension.Equals(".htm"))
            //{
            //    context.Response.Write("<hr><h1><font color=red>" +
            //        "HelloWorldModule: End of Request</font></h1>");
            //}

        }

        void ChangeCache(object sender)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpResponse response = application.Context.Response;

            string ex = ConfigurationManager.AppSettings["WebCacheExpires"];
            int expires = string.IsNullOrEmpty(ex) ? 5 : Convert.ToInt32(ex);

            //设置Expires为当前日期再加上60秒
            response.Cache.SetExpires(DateTime.Now.AddSeconds(60 * expires));
            //HttpCacheability枚举类型会找个时间解释下 
            //HttpCacheability. Public 指定响应能由客户端和共享(代理)缓存进行缓存
            response.Cache.SetCacheability(HttpCacheability.Public);
            response.Cache.SetValidUntilExpires(true);
        }
        void Filter(object sender)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;
            int statusCode = context.Response.StatusCode;
            if (statusCode==200)
            {
                string filePath = context.Request.FilePath;
                string fileExtension = VirtualPathUtility.GetExtension(filePath);
                if (fileExtension.Equals(".html") || fileExtension.Equals(".htm") || fileExtension.IndexOf(".") > 0)
                {
                    //判断缓存是否存在,不存在加入缓存,调用生成静态的类和方法  
                    //产品过期,移除静态文件,302重定向  
                    //if (System.IO.File.Exists(context.Server.MapPath(filePath)))
                    //{
                    //    context.Response.WriteFile(context.Server.MapPath(filePath));
                    //    context.Response.End();
                    //}
                }
            }            
        }
    }
}

View Code

 

相关文章