I-F中的缓存有两个名词:
缓存条目 - 要缓存的内容的封装
缓存工厂 - 用来处理要被缓存的条目的工厂类
目前实现的缓存工厂有File和APC两种。File工厂使用文件存放缓存条目,APC则利用PHP的APC模块缓存条目,通常在内存有限的情况下可以使用文件缓存,下面的例子也主要使用文件缓存。
I-F只能缓存标量(integer,float,string,boolean),null和可以序列化的数组,以及可以序列化的对象,而且由于保留了缓存对象更多的信息,所以缓存结果会比缓存的值要大。
在I-F v0.2.1以前,需要使用标准的setters方法对缓存条目进行设置:
/**
* 新建一个要缓存的条目
*/
$entry = new ICacheEntryApdater();
$entry->setKey("myKey");//键
$entry->setValue("myValue");//值
$entry->setTtl(30);//超时时间,单位是秒
//建立缓存工厂
//使用文件存储,cache/就是存放缓存文件的目录
$factory = new IFileCacheFactory("cache/");
//加入缓存
$factory->putEntry($entry);
I-F v0.2.1加入了更简便的方式:
$factory = new IFileCacheFactory("cache/");
$factory->putEntry(array(
"key" => "myKey",//键
"value" => "myValue",//值
"ttl" => 30//超时时间,单位是秒
));
当然,缓存条目(Entry)还有更多的属性:
key - 条目的键,用来访问条目
lastModified - 最后修改
lastVisited - 最后访问
maxAge - 最大生存期,一个未来的时间戳,缓存到那个时刻将失效
value - 条目的值
ttl - 有效期
同样可以使用cache factory获取已缓存的条目,结果是一个ICacheEntry的一个实例:
//通过键myKey取得条目
$entry = $factory->getEntry("myKey");
//如果不为null,则是ICacheEntry对象
if ($entry != null) {
print_r($entry->getValue());//打印值
}
通过getEntry取得条目的好处是可以得到缓存的其他相关信息,不仅仅是值。如果只想得到缓存的值,可以简单地通过
$myValue = $factory->getValue("myKey");
来获取。
可以使用remove删除一个键对应的缓存;使用clear清空整个factory中的条目:
//删除myKey对应的条目
$factory->removeEntry("myKey");
//清空整个factory
$factory->clear();
//尝试从缓存中取
$factory = new IFileCacheFactory(dirname(__FILE__));
$sentences = $factory->getValue("sentences");
if ($sentences != null) {
echo "from cache<br/>";
}
else {
//查询
$manager = TSentence::manager();
$sentences = $manager->findAll();
//加入缓存
$factory->putEntry(array(
"key" => "sentences",
"value" => $sentences,
"ttl" => 3600
));
}
//打印结果
print_r($sentences);