YII2的高效篇

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]);
            },
        ],
    ];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 缓存是用于提升网站性能的一种即简单又有效的途径。通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时...
    layjoy阅读 305评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,898评论 25 709
  • 从前,有一个不懂爱的公主在森林里迷了路。她四处游荡,遇见了一个巫婆。巫婆问她:“你爱着谁?”公主回答:“我谁也不爱...
    半枕山月阅读 678评论 3 3
  • 有一天,我去表哥家做客侄子在客厅看电视声音开地很大大到我觉得楼上邻居都应该听到了 表哥,表嫂,还有小孩的爷爷奶奶我...
    娟姐的自由国度阅读 1,263评论 0 0
  • 早上我总是先起床 她一直习惯性恋床 我在卫生间洗漱 突然听见她带着困意不愿起床的哼哼声 不由得想笑 莫名的感动 这...
    Dorothy桃乐斯阅读 222评论 0 0