最新公告
  • 欢迎您光临源库坊,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • wordpress http缓存策略及实现

    在我写完《http协议学习札记》之后,意识到,要写一个Wordpress的http缓存策略,因为对于wp博客这种内容更新非常规律的站点,使用http缓存策略实在是太方便了。当染,http是基于客户端的,也就是说,如果你的博客来访都是新人,而不是老访客,那这篇文章也没啥用。http缓存针对的是同一个用户多次访问同一个url的一种策略。对于同一个用户而言,它第一次访问你的博客某个页面之后,这个页面被缓存在他的浏览器里面,当他第二次打开这个页面的时候,可以快速的从浏览器里面调用出缓存进行展示,而无需再下载网页内容显示。

    http缓存知识

    这一部分不打算讲太多,你可以阅读上面提到的那本小册子的缓存部分。这里我们要提到的是,我们将同时利用cache-control和last-modified两种基于时间的缓存机制。

    缓存策略

    这部分主要要把缓存的思路说清楚。我们要搞清楚,缓存的目的和最佳方式。对于一个用户打开一个页面而言,可能有几种情况:

    • 刚刚打开过,或者刷新页面
    • 不久前(昨天)打开过
    • 很久前(上个月)打开过

    对于一个内容页面而言,它要展示的内容是否有改变呢?主要基于以下几个方面去考虑:

    • 是否在后台编辑过文章
    • 是否有人发布(编辑)了评论

    对于一个分类或标签等列表页,则只考虑:

    • 是否在这个分类或标签列表中有新的文章发布

    以上我认为是页面应该在有缓存的情况下还要重新使用新内容的情况。这里我没有考虑到其他的变素,例如修改了主题、某个细节上修改了(例如后台修改了自定义栏目的某个值)。总之,你可以发现,这个思考的角度完全可以基于内容变化的时间(这个时间被记录在数据库中)来进行判断,而且是单一的,不负责,不需要另外开辟数据库来存储某些时间。

    接下来我们来看下怎么设计我们的缓存。

    • 对于一个页面,我们采用短时效的cache-control缓存,用于保证一个用户在短时间内多次访问同一个页面,使用缓存
    • 当超出这个短时效时间之后,进行last-modified的判断,决定是否用缓存
      • 如果这个页面没有被缓存过,直接显示
      • 如果这个页面被缓存了,文章(内容)是否在上次缓存之后发生了变化
        • 如果内容发生变化,使用新内容显示
        • 如果内容没有发生变化,查看上一次缓存的记录时间,如果记录时间太过久远,更新这个记录时间,返回新内容,这样可以让用户得到一次新内容,这样,当你的主题更新了,也可以保证用户在一段时间后可以看到新版本主题的样子

    上面就是关于这个策略的设计。

    实现代码

    通过对上面的思路的梳理,我们创建一个函数用来实现这套策略。你可能希望写一个插件自动实现这一套,但是不同的页面可能采用不同的策略,所以我的想法是,在主题中提供一个函数,然后在不同的页面文件里面去调用这个函数,这样可以让不同页面的缓存时间完全不同。

    <?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的header函数,因此,它必须在有任何内容输出之前被调用,所以你可以在某个主题文件的开头,get_header()之前调用:

    <?php
    wp_http_cache(10, 3600*24*30);
    get_header();
    ...

    它有两个参数,都是以秒作为单位的数字,第一个参数代表cache-control的过期时间,第二个参数表示当一个last-modified缓存被记录多久之后应该被更新。

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"www.yuankufang.com",如遇到无法解压的请联系管理员!
    源库坊 » wordpress http缓存策略及实现

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    源库坊
    一个高级程序员模板开发平台
    • 353会员总数(位)
    • 1194资源总数(个)
    • 2本周发布(个)
    • 0 今日发布(个)
    • 1536稳定运行(天)

    提供最优质的资源集合

    赞助本站svip 了解详情