YII2缓存

来源:互联网 发布:java模拟器安卓版5.1 编辑:程序博客网 时间:2024/05/23 16:50


  • 数据缓存
  • 片段缓存
  • 页面缓存
  • HTTP 缓存

    缓存组件

    数据缓存需要缓存组件提供支持,它代表各种缓存存储器, 例如内存,文件,数据库。

    缓存组件通常注册为应用程序组件,这样 它们就可以在全局进行配置与访问。 如下代码演示了如何配置应用程序组件 cache 使用 两个memcached 服务器:

    'components' => [    'cache' => [        'class' => 'yii\caching\MemCache',        'servers' => [            [                'host' => 'server1',                'port' => 11211,                'weight' => 100,            ],            [                'host' => 'server2',                'port' => 11211,                'weight' => 50,            ],        ],    ],],

    然后就可以通过 Yii::$app->cache 访问上面的缓存组件了。


    Yii 支持一系列缓存存储器,概况如下:

    • yii\caching\ApcCache:使用 PHP APC 扩展。这个选项可以 认为是集中式应用程序环境中(例如:单一服务器, 没有独立的负载均衡器等)最快的缓存方案。
    • yii\caching\DbCache:使用一个数据库的表存储缓存数据。要使用这个缓存,你必须 创建一个与 yii\caching\DbCache::cacheTable 对应的表。
    • yii\caching\DummyCache: 仅作为一个缓存占位符,不实现任何真正的缓存功能。 这个组件的目的是为了简化那些需要查询缓存有效性的代码。 例如,在开发中如果服务器没有实际的缓存支持,用它配置 一个缓存组件。一个真正的缓存服务启用后,可以再切换为使用相应的缓存组件。 两种条件下你都可以使用同样的代码 Yii::$app->cache->get($key) 尝试从缓存中取回数据而不用担心 Yii::$app->cache 可能是 null
    • yii\caching\FileCache:使用标准文件存储缓存数据。这个特别适用于 缓存大块数据,例如一个整页的内容。
    • yii\caching\MemCache:使用 PHP memcache 和 memcached 扩展。 这个选项被看作分布式应用环境中(例如:多台服务器, 有负载均衡等)最快的缓存方案。
    • yii\redis\Cache:实现了一个基于 Redis 键值对存储器 的缓存组件(需要 redis 2.6.12 及以上版本的支持 )。
    • yii\caching\WinCache:使用 PHP WinCache (另可参考 )扩展。
    • yii\caching\XCache:使用 PHP XCache扩展。
    • yii\caching\ZendDataCache:使用 Zend Data Cache 作为底层缓存媒介。

    所有缓存组件都有同样的基类 yii\caching\Cache ,因此都支持如下 API:

    • yii\caching\Cache::get():通过一个指定的键(key)从缓存中取回一项数据。如果该项数据 不存在于缓存中或者已经过期/失效,则返回值 false。
    • yii\caching\Cache::set():将一项数据指定一个键,存放到缓存中。
    • yii\caching\Cache::add():如果缓存中未找到该键,则将指定数据存放到缓存中。
    • yii\caching\Cache::mget():通过指定的多个键从缓存中取回多项数据。
    • yii\caching\Cache::mset():将多项数据存储到缓存中,每项数据对应一个键。
    • yii\caching\Cache::madd():将多项数据存储到缓存中,每项数据对应一个键。 如果某个键已经存在于缓存中,则该项数据会被跳过。
    • yii\caching\Cache::exists():返回一个值,指明某个键是否存在于缓存中。
    • yii\caching\Cache::delete():通过一个键,删除缓存中对应的值。
    • yii\caching\Cache::flush():删除缓存中的所有数据。

    缓存过期

    缓存依赖

    例如:

    // 创建一个对 example.txt 文件修改时间的缓存依赖$dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']);// 缓存数据将在30秒后超时// 如果 example.txt 被修改,它也可能被更早地置为失效状态。$cache->set($key, $data, 30, $dependency);// 缓存会检查数据是否已超时。// 它还会检查关联的依赖是否已变化。// 符合任何一个条件时都会返回 false。$data = $cache->get($key);

    下面是可用的缓存依赖的概况:

    • yii\caching\ChainedDependency:如果依赖链上任何一个依赖产生变化,则依赖改变。
    • yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
    • yii\caching\ExpressionDependency:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
    • yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。
    • yii\caching\GroupDependency:将一项缓存数据标记到一个组名,你可以通过调用 yii\caching\GroupDependency::invalidate() 一次性将相同组名的缓存全部置为失效状态。

    在视图中使用以下结构启用片段缓存:

    过期时间(duration)

    依赖


    $dependency = [    'class' => 'yii\caching\DbDependency',    'sql' => 'SELECT MAX(updated_at) FROM post',];if ($this->beginCache($id,['duration' => 3600,'dependency' => $dependency])) {    // ... 在此生成内容 ...    $this->endCache();}
    页面缓存指的是在服务器端缓存整个页面的内容。随后当同一个页面 被请求时,内容将从缓存中取出,而不是重新生成。

    页面缓存由 yii\filters\PageCache 类提供支持,该类是一个 过滤器。它可以像这样在控制器类中使用:

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

    上述代码表示页面缓存只在 index 操作时启用,页面内容最多被缓存 60 秒,会随着当前应用的语言更改而变化。如果文章总数发生变化则缓 存的页面会失效。

    通过配置 yii\filters\HttpCache 过滤器,控制器操作渲染的内容就能 缓存在客户端。yii\filters\HttpCache 过滤器仅对 GET 和 HEAD 请求生效,它能为这些请求设置三种与缓存有关的 HTTP 头。

    • yii\filters\HttpCache::lastModified
    • yii\filters\HttpCache::etagSeed
    • yii\filters\HttpCache::cacheControlHeader

    以下是使用 Last-Modified 头的示例:

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

    以下是使用 ETag 头的示例:

    public function behaviors(){    return [        [            'class' => 'yii\filters\HttpCache',            'only' => ['view'],            'etagSeed' => function ($action, $params) {                $post = $this->findModel(\Yii::$app->request->get('id'));                return serialize([$post->title, $post->content]);            },        ],    ];}

  • 数据缓存
  • 片段缓存
  • 页面缓存
  • HTTP 缓存
  • 0 0
    原创粉丝点击