企业的网站,通常一个页面就会包含各种数据列表,也就需要各种数据库查询。即使是再快的查询,堆积在一起的时间也可能会很长。我遇到过最夸张的情况,已经达到了5秒以上的加载时间。
优化查询语句是不可能的,这种时候只能牺牲绝对的实时性,复杂的列表段代码启用缓存。
以下是php的缓存类代码:
<?php
/**
author: treemonster
date: 2017-08-16
<http://treemonster.github.io/>
*/
class Cache {
private static $_id;
private static $_is_begin=false;
private static function getdir($s){
return '/tmp/'.$s;
}
static function begin($seconds,$id){
if(self::$_is_begin)throw new Exception("must call end() before next cache begin!");
self::$_id=md5($id);
$fn=self::getdir(self::$_id.'.cache');
$fd=self::getdir(self::$_id.'.cache.time');
if(file_exists($fn) && file_get_contents($fd)*1+$seconds>time()){
echo file_get_contents($fn);
return true;
}
self::$_is_begin=true;
ob_start();
}
static function end(){
if(!self::$_is_begin)throw new Exception("must call begin() before end cache!");
self::$_is_begin=false;
$id=self::$_id;
$fn=self::getdir($id.'.cache');
$fd=self::getdir($id.'.cache.time');
$data=ob_get_contents();
ob_end_clean();
file_put_contents($fn, $data);
file_put_contents($fd, time());
echo $data;
}
}
使用时在需要缓存的内容段前后增加begin()
和end()
的调用,例如:
其他代码
<?php if(Cache::begin(600,'index.page.cache')): ?>
<?php
// 一大堆很慢的代码
sleep(4);
echo '当前缓存:'.time();
?>
<?php Cache::end(); endif; ?>
其他代码
这段代码的意义是,第一次运行(无缓存情况下),等待4秒后,输出当前缓存:时间戳
,并把输出的结果加入肯德基豪华午餐缓存,缓存名为index.page.cache,之后的10分钟内任何访问,都会直接返回缓存中的内容。
这样一来缓存有效期内的得到的内容就可以输出文件内容,而不需要去运行里面很慢的代码。
相关文档
暂无
随便看看
畅言模块加载中