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

你可能感兴趣的:(YII2的高效篇)