在令人难以置信的 Yii 框架提供的许多功能中,缓存管理系统是不能错过的东西。
Yii 框架允许我们保存静态数据和您的 SQL/Active Record 查询,如果明智地使用,可以节省大量的页面加载时间。
特别是,在本教程中,我们将学习如何缓存数据和查询。
所以,这就是我们如何在Yii中启用缓存。
激活缓存组件
第一步是激活缓存组件,只需打开配置文件(位于 protected/config/下),进入 components 数组,并在数组中添加以下代码:
1'cache'=>array(
2 'class'=>'system.caching.CDbCache'
3)
通过这样做,我们选择使用 CDbCache,这只是Yii中可用的缓存组件之一,该组件将缓存数据存储在一个SQLite(http://www.sqlite.org)数据库中,这使得它非常容易设置,虽然在性能方面不是最好的选择,但它仍然会使我们的Web应用程序略快一些。
另一个可行的和更强大的选择是使用 CApcCache组件,该组件使用了 APC,该内置的缓存系统配备了最新版本的 PHP。
由于所有这些缓存组件都是基于 CCache类的顶部,您可以通过更改组件的名称(例如 system.caching.CApcCache)轻松地从一个缓存组件切换到另一个,而无需在整个应用程序中更改任何代码。
简单的数据缓存
使用缓存的第一个和最简单的方法是存储变量,这样做,Yii的缓存组件会给你两个功能: **get()**和 set()。
因此,我们首先将一个值设置为缓存,以便这样做,我们还需要分配一个独特的ID,例如:
1// Storing $value in Cache
2$value = "This is a variable that I am storing";
3$id = "myValue";
4$time = 30; // in seconds
5
6Yii::app()->cache->set($id, $value, $time);
最后一个值,即$time
,不需要,但有助于避免在不需要时永久存储一个值。
获取存储的价值是微不足道的:
1Yii::app()->cache->get($id);
如果没有找到该值(因为它不存在或因为它以前过期),这个函数将返回一个 false 值,例如,检查某个值是否已缓存的一个好方法是:
1$val = Yii::app()->cache->get($id);
2if (!$val):
3 // the value is not cached, do something here
4else:
5 // the value is cached, do something else here
6endif;
删除一个缓存值
要删除存储在缓存中的值,我们可以调用:
1Yii::app()->cache->delete($id);
如果我们需要的是清理一切,我们只会写:
1Yii::app()->cache->flush();
寻求缓存
基于数据缓存系统,这是一个非常有用的功能,特别是对于严重依赖数据库的应用程序。
这个功能的概念相当简单,但相当坚实。
首先,我们需要做的是定义一个 _dependence 查询,换句话说,我们定义了一个更简单,更轻的数据库查询,我们将在我们真正需要的查询之前调用。
例如,如果我们想要获取的数据是图书作者列表,我们的依赖性查询可能是:
1SELECT MAX(id) FROM authors
如果没有新作者被添加,Yii的缓存组件将直接从缓存中取出作者列表,而不会再次执行我们的大查询,这可能是这样的:
1SELECT authors.*, book.title
2FROM authors
3JOIN book ON book.id = authors.book_id
Yii Query 建设者
要使用 Query Caching 与 Yii Query Builder 一起使用,这就是我们必须写的(使用之前所示的作者示例):
1// big query
2$query = ' SELECT authors.*, book.title
3FROM authors
4JOIN book ON book.id = authors.book_id';
5// dependency query
6$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
7// executing query using Yii Query Builder
8$result = Yii::app()->db->cache(1000, $dependency)->createCommand($query)->queryAll();
转移到 Yii::app()->db->cache()
的参数分别是结果应该存储的秒数和依赖性查询。
如前所述,在运行此代码时,Yii 会检查依赖性查询的结果,而不是其他任何东西。如果它找不到任何东西,或与以前存储的值不同,它会执行大查询并将结果存储在缓存中。
活跃记录
还可以缓存使用 Active Record创建的查询的结果)。
1$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
2$authors = Author::model()->cache(1000, $dependency)->with('book')->findAll();
要记住的事情
很明显,使用密集缓存的应用程序需要提前设计,因为向用户提供不一致数据的风险将不可避免地增加。
另外,不要忘记每个缓存组件可能对可存储的数据数量有限制,因此,要提前了解缓存系统的限制是很好的做法。