关于静态缓存的疑虑

浏览:474 发布日期:2016/07/19 分类:求助交流
我在做一个门户网站,用到了很多自定义标签, 由于数据量比较大,输出首页可能要2~3秒的时间, 于是我想到了静态缓存, 这样就可以秒开页面了。

我们的首页更新也不是特别频繁,我把首页的缓存时间设置的是2小时,
现在的问题是,当两小时后的第一位访问者就特倒霉,他的访问会重新生成新的页面,就会卡几秒钟, 不知道大家是怎么解决这个问题的? 求指点。

=============================================

研究了一中午,终于找到了个解决方法,但不知道好不好用,我先把代码贴上来,大神们帮我看一下,会不会有什么问题。
系统要判断缓存是否过期, 那么肯定有一个行为会去验证,于是我就去thinkphp文件夹里面找,找啊找啊, 终于找到了ReadHtmlCacheBehavior.php 这个文件。

然后我的思路就是,系统判断缓存到期后,不是立即重新更新缓存,而是先输出原有的缓存文件, 然后用异步去更新,更新完成后就会自己替换掉原有缓存文件,这样就完成了一次更新,
但问题来了, 异步怎么写, 不会, 怎么更新,还是不会。

于是又百度,研究
最后的代码static public function checkHTMLCache($cacheFile='',$cacheTime='') {
        if(I('get.cleanHtmlCache')) //如果有cleanHtmlCache参数,不管有没有到期,立即更新缓存
        {
            return false;
        }
        elseif(!is_file($cacheFile) && 'sae' != APP_MODE ){
            return false;
        }elseif (filemtime(\Think\Think::instance('Think\View')->parseTemplate()) > Storage::get($cacheFile,'mtime','html')) {
            // 模板文件如果更新静态文件需要更新
            return false;
        }elseif(!is_numeric($cacheTime) && function_exists($cacheTime)){
            return $cacheTime($cacheFile);
        }elseif ($cacheTime != 0 && NOW_TIME > Storage::get($cacheFile,'mtime','html')+$cacheTime) {
            // 文件是否在有效期
            //return false;  
            //如果缓存到期后,用异步访问 当前URL ? &cleanHtmlCache=1, 更新缓存
            $url = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']."&cleanHtmlCache=1";
            $url = str_replace("/index.php","",$url);
            $response   = '';
            $errstr = '';
            $errno = '';
            $fp = fsockopen ($_SERVER['HTTP_HOST'], 80, $errno, $errstr, 90);
            $out = "GET ".$url." HTTP/1.1\r\n";
            $out .= "Host:".$_SERVER['HTTP_HOST']."\r\n";
            $out .= "Connection: close\r\n\r\n";
            fputs ($fp, $out);
            fclose( $fp );
        }
        //静态文件有效
        return true;
    }
就这样。
现在还不知道如果高并发下会怎么样, 我们的首页生成静态要2-3秒, 如果这个时候同时有多个人刷新,那么同时就会有多个人在保存这个缓存,会不会出现什么奇怪的情况呢。
唉, 我只是一个前端工程师啊, 要搞这么复杂的东西。。
最佳答案
评论( 相关
后面还有条评论,点击查看>>