这当中令人难以置信的许多功能Yii框架提供了一个缓存管理系统是有可能不会被遗漏。
Yii框架允许我们保存静态数据和您的SQL /活动记录查询,这是明智的 - 可以导致大量的页面加载时间节省。
特别是,在本教程中,我们将学习如何缓存数据和查询。
下面是我们如何在Yii中启用缓存。
激活缓存组件
第一步是激活高速缓存组件。 只要打开你的配置文件(位于保护/配置/下),进入组件数组,数组中正确添加以下代码:
'cache'=>array(
'class'=>'system.caching.CDbCache'
)
通过这样做,我们都选择使用CDbCache,这仅仅是可用的Yii高速缓存组件之一。 在这个特殊的存储缓存数据的SQLite数据库,这使得它非常容易设置。 虽然不是性能方面的最佳选择,它仍然会使我们的Web应用程序略快。
另一个可行的和更强大的选项是使用CApcCache组件,这使得使用的APC ,附带的最新版本的内置缓存系统的PHP 。
由于所有这些缓存组件都基于CCACHE类的顶部,您可以轻松地从缓存组件通过改变成分(如system.caching.CApcCache)的名称切换到另一个,而不必改变整个应用程序中的任何代码。
简单数据缓存
使用缓存的第一种和最简单的方法是通过存储变量。 要做到这一点,Yii中的缓存组件提供了两个功能:get()和()设置 。
因此,我们首先设置一个值进行缓存。 为此,我们还必须为其分配唯一的ID。 例如:
// Storing $value in Cache
$value = "This is a variable that I am storing";
$id = "myValue";
$time = 30; // in seconds
Yii::app()->cache->set($id, $value, $time);
的最后一个值, $time
,不是必需的,尽管有用,以避免永久存储的值时,它不是必需的。
获取存储的值是微不足道的:
Yii::app()->cache->get($id);
如果值没有找到(因为它不存在,或者是因为它没有到期之前),这个函数会返回一个错误值。 因此,例如,检查某个值是否被缓存的一种好方法是:
$val = Yii::app()->cache->get($id);
if (!$val):
// the value is not cached, do something here
else:
// the value is cached, do something else here
endif;
删除缓存的值
要删除存储在缓存中的值,我们可以调用:
Yii::app()->cache->delete($id);
如果我们需要的是清理一切,我们将只写:
Yii::app()->cache->flush();
查询缓存
建立在数据缓存系统之上,这是一个非常有用的功能,特别是对于强烈依赖数据库的重型应用程序。
这个特征的概念相当容易,但是很坚固。
首先,我们所要做的就是定义一个依赖查询 。 换句话说,我们定义一个更简单和更轻的数据库查询,我们将在我们真正需要的之前调用。 这样做的原因是检查自上次执行查询以来是否有任何更改。
例如,如果我们要检索的数据是Book Authors的列表,我们的依赖关系查询可能是:
SELECT MAX(id) FROM authors
通过这样做,我们将能够看到,是否有任何新作者从上次我们检查后添加。 如果没有添加新作者,Yii的缓存组件将直接从缓存中获取作者列表,而不会再次执行我们的大查询,这可能是:
SELECT authors.*, book.title
FROM authors
JOIN book ON book.id = authors.book_id
Yii查询生成器
要使用Yii的使用查询缓存查询生成器 ,这是我们必须写[用作者的例子显示,前]
// big query
$query = ' SELECT authors.*, book.title
FROM authors
JOIN book ON book.id = authors.book_id';
// dependency query
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
// executing query using Yii Query Builder
$result = Yii::app()->db->cache(1000, $dependency)->createCommand($query)->queryAll();
该参数传递给Yii::app()->db->cache()
分别是秒的量,其结果应存放并依赖查询。
如前所述,当运行此代码时,Yii将在任何其他操作之前检查依赖性查询的结果。 如果它没有找到任何东西,或不同于之前存储的值,它将执行大查询并将结果存储在缓存中。 否则,它将从缓存中提取大查询结果。
活动记录
另外,也可以对高速缓存使用由一个查询的结果活动记录 。 该概念保持与之前解释的相同; 但是用不同的语法,当然:
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors');
$authors = Author::model()->cache(1000, $dependency)->with('book')->findAll();
需要记住的事情
很明显,密集使用缓存的应用程序需要提前精心设计,因为向用户提供不一致数据的风险将不可避免地增加。
此外,不要忘记每个缓存组件可能对可以存储的数据量有限制。 因此,提前发现缓存系统的限制是一个很好的做法。