如何在 Yii 框架中使用缓存来提高性能

在令人难以置信的 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();

要记住的事情


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

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

Submitted by: Marco Troisi
Published At
Categories with 技术
comments powered by Disqus