我们的首页更新也不是特别频繁,我把首页的缓存时间设置的是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秒, 如果这个时候同时有多个人刷新,那么同时就会有多个人在保存这个缓存,会不会出现什么奇怪的情况呢。
唉, 我只是一个前端工程师啊, 要搞这么复杂的东西。。
最佳答案