美文网首页
YII2的高效篇

YII2的高效篇

作者: Syuusuke | 来源:发表于2016-09-01 10:45 被阅读0次

    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]);
                },
            ],
        ];
    }
    

    相关文章

      网友评论

          本文标题:YII2的高效篇

          本文链接:https://www.haomeiwen.com/subject/wamcettx.html