如何在Yii框架中使用缓存来提高性能
在令人难以置信的 Yii 框架 提供的众多功能中,缓存管理系统是不可缺少的。
Yii 框架允许我们保存静态数据和您的 SQL/Active Record 查询,如果使用得当,可以节省大量页面加载时间。
特别是,在本教程中,我们将学习如何缓存数据和查询。
下面是我们如何在 Yii 中启用缓存。
激活缓存组件
第一步包括激活缓存组件。 只需打开您的配置文件(位于 protected/config/ 下),转到 components 数组,然后在数组中添加以下代码:
'cache'=>array( 'class'=>'system.caching.CDbCache' )
通过这样做,我们选择使用 CDbCache,它只是 Yii 可用的缓存组件之一。 这个特殊的将缓存数据存储在 SQLite 数据库中,这使得设置非常容易。 虽然在性能方面不是最佳选择,但它仍然会使我们的 Web 应用程序稍微快一些。
另一个可行且更强大的选项是使用 CApcCache 组件,该组件利用 APC,最新版本的 PHP[X191X 附带的内置缓存系统]。
由于所有这些缓存组件都基于 CCache 类,您可以通过更改组件的名称轻松地从缓存组件切换到另一个缓存组件(例如 system.caching.CApcCache),而不必在整个应用程序中更改任何代码。
简单数据缓存
使用缓存的第一个也是最简单的方法是存储变量。 为此,Yii 的缓存组件为您提供了两个函数:get() 和 set()。
所以我们首先设置一个要缓存的值。 为此,我们还必须为其分配一个唯一 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);
如果找不到该值(因为它不存在或因为它之前确实过期),此函数将返回一个 false 值。 因此,例如,检查某个值是否被缓存的好方法是:
$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();
查询缓存
建立在数据缓存系统之上,这是一个非常有用的功能,特别是对于高度依赖数据库的重型应用程序。
此功能的概念相当简单但非常扎实。
首先,我们要做的是定义一个依赖查询。 换句话说,我们定义了一个更简单、更轻量级的数据库查询,我们将在我们真正需要的查询之前调用它。 这样做的原因是检查自我们上次执行该查询以来是否有任何变化。
例如,如果我们要检索的数据是书籍作者列表,我们的依赖关系查询很可能是:
SELECT MAX(id) FROM authors
通过这样做,我们将能够查看自上次检查以来是否添加了任何新作者。 如果没有添加新作者,Yii 的 Cache 组件将直接从缓存中获取作者列表,而无需再次执行我们的大查询,可能类似于:
SELECT authors.*, book.title FROM authors JOIN book ON book.id = authors.book_id
Yii 查询生成器
要在 Yii Query Builder 中使用查询缓存,这是我们必须编写的 [使用前面显示的作者示例]:
// 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 将首先检查依赖查询的结果。 如果它没有找到任何东西,或者与之前存储的值不同,它将执行大查询并将结果存储在缓存中。 否则它将从缓存中提取大查询结果。
活动记录
也可以缓存使用 Active Record 进行的查询的结果。 这个概念与前面解释的一样; 但当然有不同的语法:
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM authors'); $authors = Author::model()->cache(1000, $dependency)->with('book')->findAll();
要记住的事情
很明显,一个密集使用缓存的应用程序需要提前设计好,因为向用户提供不一致数据的风险将不可避免地增加。
另外,不要忘记每个缓存组件可能对可以存储的数据量有限制。 因此,最好提前找出缓存系统的限制。