Yii 片段缓存
片段缓存提供对网页片段的缓存。
步骤1 - 在SiteController中添加一个名为 actionFragmentCaching() 的新函数。
public function actionFragmentCaching() {
user = new MyUser();user->name = "cached user name";
user->email = "cacheduseremail@gmail.com";user->save();
models = MyUser::find()->all();
returnthis->render('cachedview', ['models' => $models]);
}
在上面的代码中,我们创建了一个新用户并显示了一个缓存视图文件。
步骤2 - 现在,在 views/site 文件夹中创建一个名为 cachedview.php 的新文件。
<?php if (this->beginCache('cachedview')) { ?>
<?php foreach (models as model): ?>
<?=model->id; ?>
<?= model->name; ?>
<?=model->email; ?>
<br/>
<?php endforeach; ?>
<?php $this->endCache(); } ?>
<?php echo "Count:", \app\models\MyUser::find()->count(); ?>
我们在一对beginCache()和endCache()方法中封装了一个内容生成逻辑。如果内容在缓存中找到,beginCache()方法将呈现它。
步骤3 − 转到URL http://localhost:8080/index.php?r=site/fragment-caching 并重新加载页面。以下将是输出结果。
注意,在beginCache()和endCache()方法之间的内容会被缓存。在数据库中,我们有13个用户,但只显示了12个。
页面缓存
页面缓存提供对整个网页内容进行缓存。页面缓存由 yii\filter\PageCache 支持。
步骤1 - 修改SiteController的 behaviors() 函数。
public function behaviors() {
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60
],
];
}
以上代码会将首页缓存60秒。
步骤2 - 打开以下URL: http://localhost:8080/index.php?r=site/index 。然后,修改index视图文件中的祝贺消息。如果重新加载页面,你不会注意到任何变化,因为页面被缓存了。等待一分钟后再重新加载页面。
HTTP缓存
Web应用程序也可以使用客户端缓存。要使用它,您可以为控制器操作配置 yii\filter\HttpCache 过滤器。
Last-Modified头使用时间戳来指示页面是否已被修改。
步骤1 − 要启用发送Last-Modified头,配置yii\filter\HttpCache::$lastModified属性。
public function behaviors() {
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function (action,params) {
q = new \yii\db\Query();
returnq->from('news')->max('created_at');
},
],
];
}
在上面的代码中,我们只为首页启用了HTTP缓存。当浏览器第一次打开首页时,页面在服务器端生成并发送到浏览器。第二次打开,如果没有新闻创建,服务器将不会重新生成页面。
Etag头提供了表示页面内容的哈希值。如果页面发生了更改,哈希值也会发生变化。
步骤2 - 要启用发送Etag头,请配置 yii\filters\HttpCache::$etagSeed 属性。
public function behaviors() {
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'etagSeed' => function (action,params) {
user =this->findModel(\Yii::app->request->get('id'));
return serialize([user->name, $user->email]);
},
],
];
}
在上述代码中,我们仅为 index 操作启用了HTTP缓存。它应该根据用户的姓名和电子邮件生成Etag HTTP头。当浏览器第一次打开index页时,页面在服务器端生成并发送到浏览器。第二次,如果姓名或电子邮件没有更改,服务器将不会重新生成页面。