深入解析PHP的Yii框架中的缓存功能
|
数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。它也是更高级缓存特性的基础,例如查询缓存和内容缓存。 如下代码是一个典型的数据缓存使用模式。其中 $cache 指向缓存组件: get($key);if ($data === false) { // $data 在缓存中没有找到,则重新计算它的值 // 将 $data 存放到缓存供下次使用 // 这儿 $data 可以使用了。 缓存组件数据缓存需要缓存组件提供支持,它代表各种缓存存储器,例如内存,文件,数据库。 缓存组件通常注册为应用程序组件,这样它们就可以在全局进行配置与访问。如下代码演示了如何配置应用程序组件 cache 使用两个 memcached 服务器: [ 'cache' => [ 'class' => 'yiicachingMemCache','servers' => [ [ 'host' => 'server1','port' => 11211,'weight' => 100,],[ 'host' => 'server2','weight' => 50,然后就可以通过 Yii::$app->cache 访问上面的缓存组件了。 由于所有缓存组件都支持同样的一系列 API ,并不需要修改使用缓存的业务代码就能直接替换为其他底层缓存组件,只需在应用配置中重新配置一下就可以。例如,你可以将上述配置修改为使用 yiicachingApcCache: [ 'cache' => [ 'class' => 'yiicachingApcCache',Tip: 你可以注册多个缓存组件,很多依赖缓存的类默认调用名为 cache 的组件(例如 yiiwebUrlManager)。 支持的缓存存储器Yii 支持一系列缓存存储器,概况如下:
缓存 API所有缓存组件都有同样的基类 yiicachingCache ,因此都支持如下 API:
由于 yiicachingCache 实现了 PHP ArrayAccess 接口,缓存组件也可以像数组那样使用,下面是几个例子: set('var1',$value1); $value2 = $cache['var2']; // 等价于: $value2 = $cache->get('var2');缓存键存储在缓存中的每项数据都通过键作唯一识别。当你在缓存中存储一项数据时,必须为它指定一个键,稍后从缓存中取回数据时,也需要提供相应的键。 你可以使用一个字符串或者任意值作为一个缓存键。当键不是一个字符串时,它将会自动被序列化为一个字符串。 定义一个缓存键常见的一个策略就是在一个数组中包含所有的决定性因素。例如,yiidbSchema 使用如下键存储一个数据表的结构信息。 db->dsn,// 数据源名称 $this->db->username,// 数据库登录用户名 $name,// 表名 ];如你所见,该键包含了可唯一指定一个数据库表所需的所有必要信息。 当同一个缓存存储器被用于多个不同的应用时,应该为每个应用指定一个唯一的缓存键前缀以避免缓存键冲突。可以通过配置 yiicachingCache::keyPrefix 属性实现。例如,在应用配置中可以编写如下代码: [ 'cache' => [ 'class' => 'yiicachingApcCache','keyPrefix' => 'myapp',// 唯一键前缀 ],为了确保互通性,此处只能使用字母和数字。 缓存过期默认情况下,缓存中的数据会永久存留,除非它被某些缓存策略强制移除(例如:缓存空间已满,最老的数据会被移除)。要改变此特性,你可以在调用 yiicachingCache::set() 存储一项数据时提供一个过期时间参数。该参数代表这项数据在缓存中可保持有效多少秒。当你调用 yiicachingCache::get() 取回数据时,如果它已经过了超时时间,该方法将返回 false,表明在缓存中找不到这项数据。例如: set($key,$data,45);sleep(50); $data = $cache->get($key); 缓存依赖除了超时设置,缓存数据还可能受到缓存依赖的影响而失效。例如,yiicachingFileDependency 代表对一个文件修改时间的依赖。这个依赖条件发生变化也就意味着相应的文件已经被修改。因此,缓存中任何过期的文件内容都应该被置为失效状态,对 yiicachingCache::get() 的调用都应该返回 false。 缓存依赖用 yiicachingDependency 的派生类所表示。当调用 yiicachingCache::set() 在缓存中存储一项数据时,可以同时传递一个关联的缓存依赖对象。例如: 'example.txt']);
// 缓存数据将在30秒后超时 // 缓存会检查数据是否已超时。 下面是可用的缓存依赖的概况:
查询缓存查询缓存是一个建立在数据缓存之上的特殊缓存特性。它用于缓存数据库查询的结果。 查询缓存需要一个 yiidbConnection 和一个有效的 cache 应用组件。查询缓存的基本用法如下,假设 $db 是一个 yiidbConnection 实例: $db->beginCache($duration,$dependency);
// ...这儿执行数据库查询... $db->endCache(); 如你所见,beginCache() 和 endCache() 中间的任何查询结果都会被缓存起来。如果缓存中找到了同样查询的结果,则查询会被跳过,直接从缓存中提取结果。 查询缓存可以用于 ActiveRecord 和 DAO。 Info: 有些 DBMS (例如:MySQL)也支持数据库服务器端的查询缓存。你可以选择使用任一查询缓存机制。上文所述的查询缓存的好处在于你可以指定更灵活的缓存依赖因此可能更加高效。 配置查询缓存有两个通过 yiidbConnection 设置的配置项: yiidbConnection::queryCacheDuration: 查询结果在缓存中的有效期,以秒表示。如果在调用 yiidbConnection::beginCache() 时传递了一个显式的时值参数,则配置中的有效期时值会被覆盖。 yiidbConnection::queryCache: 缓存应用组件的 ID。默认为 'cache'。只有在设置了一个有效的缓存应用组件时,查询缓存才会有效。 限制条件 当查询结果中含有资源句柄时,查询缓存无法使用。例如,在有些 DBMS 中使用了 BLOB 列的时候,缓存结果会为该数据列返回一个资源句柄。 有些缓存存储器有大小限制。例如,memcache 限制每条数据最大为 1MB。因此,如果查询结果的大小超出了该限制,则会导致缓存失败。 片段缓存片段缓存指的是缓存页面内容中的某个片段。例如,一个页面显示了逐年销售额的摘要表格,可以把表格缓存下来,以消除每次请求都要重新生成表格的耗时。片段缓存是基于数据缓存实现的。 在视图中使用以下结构启用片段缓存: beginCache($id)) {// ... 在此生成内容 ... $this->endCache(); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
