1.延迟加载
只有在类被使用的时候才会被加载
实现方式:
spl_autoload_register()
可以看到YII的项目的入口文件加载了这个文件。
// 引入 vendor 中的 autoload.php 文件,会基于 composer 的机制自动加载类
require(__DIR__ . '/../vendor/autoload.php');
2.类的映射表机制
创建类的映射表加快类的加载
Yii::$classMap = [
'app/test/Test' => '/var/www/basic/webtest/Test.php'
];
3.组件的延迟加载
组件只有在使用的时候才会被加载
4.缓存机制
1. 数据缓存
缓存的基本方法:
//获取缓存实例
$cache = Yii::$app->cache;
//获取缓存值
$data = $cache->get('cache_data_key');
//设置缓存
$cache->set('cache_data_key', $cacheData, 60*60);
//删除单个缓存
$cache->delete('testcache');
//清空缓存
$cache->flush();
缓存依赖:
- yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
- yii\caching\ExpressionDependency:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
- yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。
缓存示例:
// 创建一个对 example.txt 文件修改时间的缓存依赖
$dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']);
// 缓存数据将在30秒后超时
// 如果 example.txt 被修改,它也可能被更早地置为失效状态。
$cache->set($key, $data, 30, $dependency);
// 缓存会检查数据是否已超时。
// 它还会检查关联的依赖是否已变化。
// 符合任何一个条件时都会返回 false。
$data = $cache->get($key);
2. 片段缓存
片段缓存指的是缓存页面内容中的某个片段。例如,一个页面显示了逐年销售额的摘要表格, 可以把表格缓存下来,以消除每次请求都要重新生成表格 的耗时。片段缓存是基于数据缓存实现的。
//设置缓存依赖
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
//使用缓存依赖和缓存开关
if ($this->beginCache($id, ['dependency' => $dependency, 'enabled' => Yii::$app->request->isGet])) {
//动态内容,每次动用都会改变,不会被缓存影响
echo $this->renderDynamic('return Yii::$app->user->identity->name;');
$this->endCache();
}
关于缓存嵌套:外层的失效时间应该短于内层,外层的依赖条件应该低于内层,以确保最小的片段,返回的是最新的数据。
3. 页面缓存
页面缓存指的是在服务器端缓存整个页面的内容。随后当同一个页面 被请求时,内容将从缓存中取出,而不是重新生成。
public function behaviors(){
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM post',
],
],
];
}
页面缓存和片段缓存极其相似。它们都支持 duration,dependencies, variations 和 enabled 配置选项。它们的主要区别是页面缓存是由过滤器实现, 而片段缓存则是一个小部件。
4. HTTP缓存
- yii\filters\HttpCache::lastModified //返回最后修改的时间戳是否有变化
- yii\filters\HttpCache::etagSeed //返回的字符串是否有变化
如果没有变化系统会返回304的状态码,提示浏览器使用缓存中的数据。
etagSeed>lastModified 如果两者同时使用的话,只有当etagSeed改变的时候,系统才会认为数据有变化
public function behaviors(){
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('post')->max('updated_at');
},
'etagSeed' => function ($action, $params) {
$post = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$post->title, $post->content]);
},
],
];
}
网友评论