wordpress http缓存策略及实现

广告位招租
扫码页面底部二维码联系

在我写完《本文作者:唐霜,转载请注明出处。http协议学习札记【版权所有,侵权必究】》之后,意识到,要写一个Wordpres【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】s的http缓存策略,因为对于wp博客这转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。种内容更新非常规律的站点,使用http缓转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。存策略实在是太方便了。当染,http是基著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。于客户端的,也就是说,如果你的博客来访都【本文首发于唐霜的博客】【本文首发于唐霜的博客】是新人,而不是老访客,那这篇文章也没啥用【原创不易,请尊重版权】【未经授权禁止转载】。http缓存针对的是同一个用户多次访问本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。同一个url的一种策略。对于同一个用户而未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。言,它第一次访问你的博客某个页面之后,这本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】个页面被缓存在他的浏览器里面,当他第二次【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】打开这个页面的时候,可以快速的从浏览器里转载请注明出处:www.tangshuang.net【未经授权禁止转载】面调用出缓存进行展示,而无需再下载网页内【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。容显示。

【本文首发于唐霜的博客】原创内容,盗版必究。【转载请注明来源】

http缓存知识本文作者:唐霜,转载请注明出处。

【原创内容,转载请注明出处】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。

这一部分不打算讲太多,你可以阅读上面提到【作者:唐霜】未经授权,禁止复制转载。的那本小册子的缓存部分未经授权,禁止复制转载。。这里我们要提到的是,我们将同时利用ca【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。che-control和last-mod转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】ified两种基于时间的缓存机制。

【原创内容,转载请注明出处】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

缓存策略原创内容,盗版必究。

【作者:唐霜】原创内容,盗版必究。转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net

这部分主要要把缓存的思路说清楚。我们要搞本文作者:唐霜,转载请注明出处。【未经授权禁止转载】清楚,缓存的目的和最佳方式。对于一个用户原创内容,盗版必究。原创内容,盗版必究。打开一个页面而言,可能有几种情况:

【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】
  • 刚刚打开过,或者刷新页面著作权归作者所有,禁止商业用途转载。
  • 著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】
  • 不久前(昨天)打开过【关注微信公众号:wwwtangshuangnet】
  • 【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net
  • 很久前(上个月)打开过本文版权归作者所有,未经授权不得转载。
  • 【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【本文首发于唐霜的博客】原创内容,盗版必究。【本文首发于唐霜的博客】

对于一个内容页面而言,它要展示的内容是否转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。有改变呢?主要基于以下几个方面去考虑:

【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。
  • 是否在后台编辑过文章著作权归作者所有,禁止商业用途转载。
  • 本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。
  • 是否有人发布(编辑)了评论【版权所有】唐霜 www.tangshuang.net
  • 著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【版权所有,侵权必究】

对于一个分类或标签等列表页,则只考虑:【原创不易,请尊重版权】

转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net
  • 是否在这个分类或标签列表中有新的文章发布
  • 【原创不易,请尊重版权】【本文首发于唐霜的博客】【本文受版权保护】转载请注明出处:www.tangshuang.net【作者:唐霜】

以上我认为是页面应该在有缓存的情况下还要【转载请注明来源】本文作者:唐霜,转载请注明出处。重新使用新内容的情况。这里我没有考虑到其本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。他的变素,例如修改了主题、某个细节上修改【转载请注明来源】【版权所有】唐霜 www.tangshuang.net了(例如后台修改了自定义栏目的某个值)。【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】总之,你可以发现,这个思考的角度完全可以【转载请注明来源】【原创不易,请尊重版权】基于内容变化的时间(这个时间被记录在数据【原创不易,请尊重版权】【作者:唐霜】库中)来进行判断,而且是单一的,不负责,著作权归作者所有,禁止商业用途转载。【转载请注明来源】不需要另外开辟数据库来存储某些时间。

【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net

接下来我们来看下怎么设计我们的缓存。著作权归作者所有,禁止商业用途转载。

【作者:唐霜】【转载请注明来源】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。
  • 对于一个页面,我们采用短时效的cache【原创内容,转载请注明出处】【未经授权禁止转载】-control缓存,用于保证一个用户在原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】短时间内多次访问同一个页面,使用缓存
  • 【作者:唐霜】本文作者:唐霜,转载请注明出处。【本文受版权保护】
  • 当超出这个短时效时间之后,进行last-未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】modified的判断,决定是否用缓存
    • 如果这个页面没有被缓存过,直接显示【访问 www.tangshuang.net 获取更多精彩内容】
    • 【版权所有】唐霜 www.tangshuang.net【转载请注明来源】转载请注明出处:www.tangshuang.net【本文受版权保护】
    • 如果这个页面被缓存了,文章(内容)是否在本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。上次缓存之后发生了变化
      • 如果内容发生变化,使用新内容显示本文版权归作者所有,未经授权不得转载。
      • 转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】
      • 如果内容没有发生变化,查看上一次缓存的记【转载请注明来源】【原创不易,请尊重版权】录时间,如果记录时间太过久远,更新这个记【原创内容,转载请注明出处】【转载请注明来源】录时间,返回新内容,这样可以让用户得到一【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net次新内容,这样,当你的主题更新了,也可以【本文首发于唐霜的博客】【版权所有,侵权必究】保证用户在一段时间后可以看到新版本主题的【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。样子
      • 【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
    • 转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
  • 【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。

上面就是关于这个策略的设计。原创内容,盗版必究。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】

实现代码【版权所有】唐霜 www.tangshuang.net

【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【本文受版权保护】

通过对上面的思路的梳理,我们创建一个函数本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。用来实现这套策略。你可能希望写一个插件自【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net动实现这一套,但是不同的页面可能采用不同【作者:唐霜】【本文首发于唐霜的博客】的策略,所以我的想法是,在主题中提供一个转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】函数,然后在不同的页面文件里面去调用这个【作者:唐霜】转载请注明出处:www.tangshuang.net函数,这样可以让不同页面的缓存时间完全不【本文首发于唐霜的博客】【原创内容,转载请注明出处】同。

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net
<?php
/**
 * Name: 浏览器缓存页面
 * Description: 在主题中使用wp_http_cache()函数可以实现将网页缓存在浏览器,下次打开时秒开,默认缓存5秒
 */
/**
 * @param $expire cache-control缓存的时间,默认5秒,防止不断刷新页面
 * @param $interval 304的有效时间,当$_SERVER['HTTP_IF_MODIFIED_SINCE'] + $since < time()时,304失效
 */
function wp_http_cache($expire = 5, $interval = 3600*24) {
    /**
     * 所有的页面都有一个5秒的静态缓存,防止页面被刷爆,也就是说一个用户一旦打开一个页面,那么在接下来的5秒内永远看到一样的内容
     */
    $currentTime = time();
    header("Cache-Control: public");
    header("Pragma: cache");
    header("Cache-Control: max-age=$expires");
    header("Expires: " . gmdate("D, d M Y H:i:s", $currentTime + $expire) . " GMT");
    $cache_by = function($last_modified) {
        if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
            $if_modified_since = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
            $last_modified_time = strtotime($last_modified);
            $if_modified_since_time = strtotime($if_modified_since);
            // 如果文章更新的时间比上一次记录的时间小或等,那么进入下一步判断
            if ($last_modified_time <= $if_modified_since_time) {
                // 如果上一次记录的时间太久远,超过interval时间,就重新发布一个新记录时间
                if ($if_modified_since_time + $interval < $currentTime) { header("Last-Modified: ".gmdate("D, d M Y H:i:s", $currentTime) . " GMT"); } // 如果距离上一次记录的时间比较近,那么直接使用304缓存 else { header("Last-Modified: $if_modified_since", true, 304); exit(); } } // 如果文章更新时间在记录的上一次缓存时间之后 else { header("Last-Modified: $last_modified"); } } else { header("Last-Modified: $last_modified"); } }; /** * 对于内容页面,通过对文章的最后编辑时间、最后一条评论时间,来决定当前页面是否使用304缓存 */ if (is_singular()) { global $post; $last_modified = $post->post_modified_gmt;
        $post_id = $post->ID;
        $args = array(
            'number' => '1',
            'post_id' => $post_id
        );
        $comments = get_comments($args);
        if (!empty($comments) && isset($comments[0])) {
            $last_comment = $comments[0];
            $last_comment_time = $last_comment->comment_date_gmt;
                
            if (strtotime($last_modified) < strtotime($last_comment_time)) { $last_modified = $last_comment_time; } } $cache_by($last_modified); } /** * 对于列表页,则通过对列表页面的第一篇文章的发表日期来判断该页面是否要使用304缓存 */ else { global $post; $last_modified = $post->post_date_gmt;
        $cache_by($last_modified);
    }
}

如何使用呢?由于缓存机制是调用的php的【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.netheader函数,因此,它必须在有任何内原创内容,盗版必究。【本文首发于唐霜的博客】容输出之前被调用,所以你可以在某个主题文【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】件的开头,get_header()之前调本文作者:唐霜,转载请注明出处。【本文受版权保护】用:

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】
<?php
wp_http_cache(10, 3600*24*30);
get_header();
...

它有两个参数,都是以秒作为单位的数字,第转载请注明出处:www.tangshuang.net【作者:唐霜】一个参数代表cache-control的未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】过期时间,第二个参数表示当一个last-【关注微信公众号:wwwtangshuangnet】【作者:唐霜】modified缓存被记录多久之后应该被本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】更新。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】

2018-04-05 7186 ,

为价值买单,打赏一杯咖啡

本文价值71.86RMB