如何使用缓存与Yii框架以提高性能

这当中令人难以置信的许多功能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();

需要记住的事情

很明显,密集使用缓存的应用程序需要提前精心设计,因为向用户提供不一致数据的风险将不可避免地增加。

此外,不要忘记每个缓存组件可能对可以存储的数据量有限制。 因此,提前发现缓存系统的限制是一个很好的做法。

:提交马尔科特罗伊西
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏