8.6. Cache

8.6.1. 加入缓存
8.6.2. 访问缓存条目
8.6.3. 删除和清空
8.6.4. 一个缓存查询内容的例子

I-F中的缓存有两个名词:

目前实现的缓存工厂有File和APC两种。File工厂使用文件存放缓存条目,APC则利用PHP的APC模块缓存条目,通常在内存有限的情况下可以使用文件缓存,下面的例子也主要使用文件缓存。

8.6.1. 加入缓存

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 - 有效期

8.6.2. 访问缓存条目

同样可以使用cache factory获取已缓存的条目,结果是一个ICacheEntry的一个实例:

//通过键myKey取得条目
$entry $factory->getEntry("myKey");

//如果不为null,则是ICacheEntry对象
if ($entry != null) {
    
print_r($entry->getValue());//打印值
}

通过getEntry取得条目的好处是可以得到缓存的其他相关信息,不仅仅是值。如果只想得到缓存的值,可以简单地通过

$myValue $factory->getValue("myKey");

来获取。

8.6.3. 删除和清空

可以使用remove删除一个键对应的缓存;使用clear清空整个factory中的条目:

//删除myKey对应的条目
$factory->removeEntry("myKey");

//清空整个factory
$factory->clear();

8.6.4. 一个缓存查询内容的例子

//尝试从缓存中取
$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);