devgroup / yii2-tag-dependency-helper
为 yii2 提供统一缓存标签名并支持失效功能的助手
Requires
- php: >=5.5.0
- yiisoft/yii2: ~2.0.6
Requires (Dev)
- phpunit/dbunit: ~1.0
- phpunit/phpunit: ~4.0
README
为 Yii2 ActiveRecord 模型提供统一缓存标签名并支持失效功能的助手。
安装
安装此扩展的首选方式是通过 composer。
运行
php composer.phar require --prefer-dist devgroup/yii2-tag-dependency-helper "*"
或添加
"devgroup/yii2-tag-dependency-helper": "*"
到您的 composer.json
文件的 require 部分。
核心概念
此扩展为 ActiveRecord 引入了 2 种标准缓存标签类型
- 通用标签 - 如果此类型的任何模型被更新/插入,则标签失效
- 对象标签 - 如果精确的模型记录被更新(例如,id=2 的 Product),则标签失效
- 组合标签 - 如果指定字段的模型记录被更新,则标签失效
使用方法
在您的活动记录模型中添加行为和特性
use \DevGroup\TagDependencyHelper\TagDependencyTrait; /** * @inheritdoc */ public function behaviors() { return [ 'CacheableActiveRecord' => [ 'class' => \DevGroup\TagDependencyHelper\CacheableActiveRecord::className(), ], ]; }
此行为自动通过模型名称和模型-id 对标签进行失效
查找模型
在 TagDependencyTrait 中有一个特殊方法用于通过使用标签缓存根据 ID 查找模型
/** * Finds or creates new model using or not using cache(objectTag is applied, not commonTag!) * @param string|int $id ID of model to find * @param bool $createIfEmptyId Create new model instance(record) if id is empty * @param bool $useCache Use cache * @param int $cacheLifetime Cache lifetime in seconds * @param bool|\Exception $throwException False or exception instance to throw if model not found or (empty id AND createIfEmptyId==false) * @return \yii\db\ActiveRecord|null|self|TagDependencyTrait * @throws \Exception */ public static function loadModel( $id, $createIfEmptyId = false, $useCache = true, $cacheLifetime = 86400, $throwException = false ) { }
示例调用: $post = Post::loadModel('', false, false, 0, new \Exception("test2"));
对于 Post 模型实例($post
),在更新、插入、删除时,缓存将自动由对象和通用标签失效。
可以通过调用 $post->invalidateTags()
进行直接失效。
在其他场景中添加缓存标签
如果您的缓存条目应该在模型中的任何行被编辑时刷新 - 使用 getCommonTag
辅助函数
$models = Configurable::getDb()->cache( function ($db) { return Configurable::find()->all($db); }, 86400, new TagDependency([ 'tags' => NamingHelper::getCommonTag(Configurable::className()), ]) );
如果您的缓存条目应该在模型的确切行被编辑时刷新 - 使用 getObjectTag
辅助函数
$cacheKey = 'Product:' . $model_id; if (false === $product = Yii::$app->cache->get($cacheKey)) { if (null === $product = Product::findById($model_id)) { throw new NotFoundHttpException; } Yii::$app->cache->set( $cacheKey, $product, 86400, new TagDependency( [ 'tags' => [ NamingHelper::getObjectTag(Product::className(), $model_id), ] ] ) ); }
如果您的缓存条目应该在具有指定字段的模型的行被编辑时刷新 - 使用 getCompositeTag
辅助函数,并在模型中覆盖 cacheCompositeTagFields
函数
//in model for cache, in this case Comments model protected function cacheCompositeTagFields() { return ['id_app', 'object_table', 'id_object']; } //Data for caching $comments = Comments::getDb()->cache( function ($db) use ($id_app, $id_object, $object_table) { return Comments::find()->where(['id_app' => $id_app, 'object_table' => $object_table, 'id_object' => $id_object])->all($db); }, 0, new TagDependency([ 'tags' => [ NamingHelper::getCompositeTag(Comments::className(), ['id_app' => $id_app, 'object_table' => $object_table, 'id_object' => $id_object]) ] ]) ); //PROFIT!
懒加载缓存
懒加载缓存是一种受到 iiifx-production/yii2-lazy-cache composer 包启发的技术。
配置后(见下文),您可以使用它如下
$pages = Yii::$app->cache->lazy(function() { return Page::find()->where(['active'=>1])->all(); }, 'AllActivePages', 3600, $dependency);
在此示例中,只有当没有找到具有键 AllActivePages
的缓存条目时,Pages 的查找查询才会执行。在成功检索模型数组后,结果将自动以 AllActivePages
作为缓存键存储在缓存中,有效期为 3600 秒,并带有 $dependency
作为缓存依赖。
配置 - 性能方式
出于性能原因(yii2 行为比特性慢) - 创建您自己的 \yii\caching\Cache
类,并将 LazyCacheTrait
添加到其中,例如
namespace app\components; class MyCache extends \yii\caching\FileCache { use \DevGroup\TagDependencyHelper\LazyCacheTrait; }
并修改您的应用程序配置以使用您的缓存组件
return [ 'components' => [ 'class' => '\app\components\MyCache', ], ];
现在您可以使用懒加载缓存
配置 - 行为方式
只需像这样修改您的配置
return [ 'components' => [ 'cache' => [ 'class' => '\yii\caching\FileCache', 'as lazy' => [ 'class' => '\DevGroup\TagDependencyHelper\LazyCache', ], ], ], ];
从 0.0.x 迁移到 1.x
- 我们将命名空间从
devgroup
更改为DevGroup
- 我们将行为拆分为 3 个组件
- CacheableActiveRecord - 为 ActiveRecord 模型的更新/插入/删除添加失效行为
- TagDependencyTrait - 必须也添加到 ActiveRecord 类中,处理失效并添加新的静态方法
loadModel
- NamingHelper - 唯一一个处理缓存标签命名策略的类
由 DevGroup.ru 提供。查看我们的其他 开源项目!