发布于 2015-08-21 15:25:06 | 564 次阅读 | 评论: 0 | 来源: 网络整理
这个类使用了由前端和后端组件组成的内部结构。前端组件如输入源或者接口,后端组件则为这个类提供了存储的选项。
尽管这个组件运行非常快速,但如果不加考虑就使用它会适得其反,特别在不需要或者不适宜使用缓存时。 我们建议你在使用缓存前核对一下场景:
温馨提示 即使使用了这些缓存,你仍然应该定期检测缓存的命中率。 通过后台提供的相关工具,这一点很容易做得到,特别是使用Memcache或者APC时。
缓存流程可以分为两部分:
输出片段是指一小块缓存和返回都一样的HTML或者文本内容。输出的内容应该是能自动 被 ob_* 函数捕获或者直接是PHP输出,这样才能缓存起来。以下实例演示了这样的使用。 它接收PHP生成的页面输出并保存在一个文件里面。缓存文件的内容每隔172800秒(2天)刷新一次。
使用这个缓存机制,无论何时调用这块代码,我们都可以通过避免重复执行辅助插件 PhalconTag::linkTo 从而获得更高的性能。
<?php
use PhalconTag;
use PhalconCacheBackendFile as BackFile;
use PhalconCacheFrontendOutput as FrontOutput;
// Create an Output frontend. Cache the files for 2 days
$frontCache = new FrontOutput(array(
"lifetime" => 172800
));
// Create the component that will cache from the "Output" to a "File" backend
// Set the cache file directory - it's important to keep the "/" at the end of
// the value for the folder
$cache = new BackFile($frontCache, array(
"cacheDir" => "../app/cache/"
));
// Get/Set the cache file to ../app/cache/my-cache.html
$content = $cache->start("my-cache.html");
// If $content is null then the content will be generated for the cache
if ($content === null) {
// Print date and time
echo date("r");
// Generate a link to the sign-up action
echo Tag::linkTo(
array(
"user/signup",
"Sign Up",
"class" => "signup-button"
)
);
// Store the output into the cache file
$cache->save();
} else {
// Echo the cached output
echo $content;
}
温馨提示 在上面的实例中,我们的代码维持不变,即输出给用户的内容和之前展示的内容是一样的。我们的缓存组件 以透明的方式捕获了页面输出并保存在缓存文件(当缓存生成时)或者在早期的一次调用时将它发送回用户预编译,故而可以避免高昂的操作。
仅仅是缓存数据,对于你的应用来说也是同等重要的。缓存通过重用常用的(非更新的)数据可以减少数据库的加载, 从而加速你的应用。
其中一个缓存适配器是文件’File’。文件适配器的配置中只需要一个key:指明缓存文件存放的目录位置。 这个配置通过cacheDir选项控制,必须,且要以反斜杠结尾。
<?php
use PhalconCacheBackendFile as BackFile;
use PhalconCacheFrontendData as FrontData;
// Cache the files for 2 days using a Data frontend
$frontCache = new FrontData(array(
"lifetime" => 172800
));
// Create the component that will cache "Data" to a "File" backend
// Set the cache file directory - important to keep the "/" at the end of
// of the value for the folder
$cache = new BackFile($frontCache, array(
"cacheDir" => "../app/cache/"
));
// Try to get cached records
$cacheKey = 'robots_order_id.cache';
$robots = $cache->get($cacheKey);
if ($robots === null) {
// $robots is null because of cache expiration or data does not exist
// Make the database call and populate the variable
$robots = Robots::find(array("order" => "id"));
// Store it in the cache
$cache->save($cacheKey, $robots);
}
// Use $robots :)
foreach ($robots as $robot) {
echo $robot->name, "n";
}
当我们改用Memcached作为后端存储器时,上面的实例改动很轻微(特别就配置而言)。
<?php
use PhalconCacheFrontendData as FrontData;
use PhalconCacheBackendLibmemcached as BackMemCached;
// Cache data for one hour
$frontCache = new FrontData(array(
"lifetime" => 3600
));
// Create the component that will cache "Data" to a "Memcached" backend
// Memcached connection settings
$cache = new BackMemCached($frontCache, array(
"servers" => array(
array(
"host" => "127.0.0.1",
"port" => "11211",
"weight" => "1"
)
)
));
// Try to get cached records
$cacheKey = 'robots_order_id.cache';
$robots = $cache->get($cacheKey);
if ($robots === null) {
// $robots is null because of cache expiration or data does not exist
// Make the database call and populate the variable
$robots = Robots::find(array("order" => "id"));
// Store it in the cache
$cache->save($cacheKey, $robots);
}
// Use $robots :)
foreach ($robots as $robot) {
echo $robot->name, "n";
}
添加到缓存的元素根据唯一的key进行识别区分。这使用文件缓存作为后端时,key就是实际的文件名。 为了从缓存中获得数据,我们仅仅需要通过唯一的key调用即可。如果key不存在,get方法将会返回null。
<?php
// Retrieve products by key "myProducts"
$products = $cache->get("myProducts");
如果你想知道在缓存中存放了哪些key,你可以调用queryKeys方法:
<?php
// Query all keys used in the cache
$keys = $cache->queryKeys();
foreach ($keys as $key) {
$data = $cache->get($key);
echo "Key=", $key, " Data=", $data;
}
// Query keys in the cache that begins with "my-prefix"
$keys = $cache->queryKeys("my-prefix");
有些时机你需要强制废除一个缓存的实体(如对被缓存的数据进行了更新)。 而仅仅需要做的只是知道对应缓存的数据存放于哪个key即可。
<?php
// Delete an item with a specific key
$cache->delete("someKey");
// Delete all items from the cache
$keys = $cache->queryKeys();
foreach ($keys as $key) {
$cache->delete($key);
}
也有可能需要根据一个给定的key来判断缓存是否存在:
<?php
if ($cache->exists("someKey")) {
echo $cache->get("someKey");
} else {
echo "Cache does not exists!";
}
“有效期”是指缓存可以多久时间(在以秒为单位)内有效。默认情况下,全部被创建的缓存都使用前端构建中设定的有效期。 你可以在创建时指定一个有效期或者在从缓存中获取数据时:
Setting the lifetime when retrieving:
<?php
$cacheKey = 'my.cache';
// Setting the cache when getting a result
$robots = $cache->get($cacheKey, 3600);
if ($robots === null) {
$robots = "some robots";
// Store it in the cache
$cache->save($cacheKey, $robots);
}
在保存时设置有效期:
<?php
$cacheKey = 'my.cache';
$robots = $cache->get($cacheKey);
if ($robots === null) {
$robots = "some robots";
// Setting the cache when saving data
$cache->save($cacheKey, $robots, 3600);
}
缓存组件的特点,就是允许开发人员使用多级缓存。这个新特性非常有用, 因为你可以在多个缓存媒介结合不同的有效期中保存相同的数据,并在有效期内从首个最快的缓存适配器开始读取,直至到最慢的适配器。
<?php
use PhalconCacheMultiple;
use PhalconCacheBackendApc as ApcCache;
use PhalconCacheBackendFile as FileCache;
use PhalconCacheFrontendData as DataFrontend;
use PhalconCacheBackendMemcache as MemcacheCache;
$ultraFastFrontend = new DataFrontend(array(
"lifetime" => 3600
));
$fastFrontend = new DataFrontend(array(
"lifetime" => 86400
));
$slowFrontend = new DataFrontend(array(
"lifetime" => 604800
));
// Backends are registered from the fastest to the slower
$cache = new Multiple(array(
new ApcCache($ultraFastFrontend, array(
"prefix" => 'cache',
)),
new MemcacheCache($fastFrontend, array(
"prefix" => 'cache',
"host" => "localhost",
"port" => "11211"
)),
new FileCache($slowFrontend, array(
"prefix" => 'cache',
"cacheDir" => "../app/cache/"
))
));
// Save, saves in every backend
$cache->save('my-key', $data);
作为缓存的接口或者输入源的前端适配器有:
为了创建你自己的前端适配器或者扩展已有的适配器,你必须 实现 PhalconCacheFrontendInterface 接口。
用于存放缓存数据的后端适配器有:
为了创建你自己的后端适配器或者扩展已有的后端适配器,你必须 实现 PhalconCacheBackendInterface 接口。
此后端存储器把缓存内容存放到本地服务器的文件。对应的选项有:
选项 | 描述 |
---|---|
prefix | 自动追加到缓存key前面的前缀 |
cacheDir | 放置缓存文件且可写入的目录 |
此后端存储器将缓存的内容存放在memcached服务器。对应的选项有:
选项 | 描述 |
---|---|
prefix | 自动追加到缓存key前面的前缀 |
host | memcached 域名 |
port | memcached 端口 |
persistent | 创建一个长连接的memcached连接? |
此后端存储器将缓存内容存放到MongoDB服务器。对应的选项有:
选项 | 描述 |
---|---|
prefix | 自动追加到缓存key前面的前缀 |
server | MongoDB的连接串 |
db | Mongo数据库名 |
collection | Mongo数据库连接 |
此后端存储器将缓存内容存放到XCache (XCache)。对应的选项有:
选项 | 描述 |
---|---|
prefix | 自动追加到缓存key前面的前缀 |
在 Phalcon Incubator 上还有更多针对这个组件可用的适配器