赵阿尼尼 / yii2-neat-cache
一个用于防止在缓存期间同时更新(狗群效应)的 Yii2 组件。
Requires
- php: >=5.4.0
- ext-curl: *
- fxp/composer-asset-plugin: *
- yiisoft/yii2: 2.0.*
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is auto-updated.
Last update: 2024-09-18 17:17:28 UTC
README
#Yii2 Neat cache
关于
改进的 Yii2 页面缓存 过滤器,以防止在 yii2 应用程序中发生狗群效应。有关狗群效应的更多信息,请参阅 http://www.sobstel.org/blog/preventing-dogpile-effect/。
安装
- 将
"pahanini/yii2-neat-cache": "*"
添加到 composer.json 文件中所需的部分
用法
有两个主要组件 MutexDependency 和 PageCache。两者都需要应用程序的 mutex 组件。
'components' => [ 'mutex' => [ 'class' => 'tests\components\MysqlMutex', ] ]
MutexDependency
例如,您需要防止对重函数的并发调用。即使函数结果在缓存过期时被缓存,也可能会出现两个 Apache 工作进程调用此函数两次或更糟糕的情况。
防止此类行为的第一个步骤是准备一个具有 dependOnAll 属性设置为 false 的链式依赖项。使用第一个子依赖项来管理数据过期。第二个依赖项是 MutexDependency。
$dependency = Yii::createObject([ 'class' => '\yii\caching\ChainedDependency', 'dependOnAll' => false, 'dependencies' => [ Yii::createObject([ 'class' => '\yii\caching\ExpressionDependency', 'expression' => 'Helper::isTimeToUpdate()', ]), Yii::createObject([ 'class' => '\pahanini\neatcache\MutexDependency', 'tag' => 'HeavyFunction', ]), ] ]);
如果第一个依赖项首次发生变化,则第二个依赖项尝试获取互斥锁,并在成功的情况下被视为更改,使缓存无效(两个依赖项都发生了更改)。
第二步是使用创建的依赖项和永不过期的持续时间值来设置缓存数据
if (!$data = Yii::$app->cache->get('heavyDataId')) { Yii::$app->cache->set('heavyDataId', heavyFunctionCall(), 0, $dependency); }
页面缓存过滤器
替换原生 yii2 页面缓存过滤器为 neat 一个,并使缓存永不过期。永久缓存允许 neat 页面缓存过滤器使用过期缓存中的旧数据来防止狗群效应。要使页面过期,您应使用任何缓存依赖项。
return [ 'pageCache' => [ 'class' => '\pahanini\neatcache\PageCache', 'only' => ['index'], 'duration' => 0, 'dependency' => [ 'class' => 'yii\caching\ExpressionDependency', 'expression' => '\tests\NeatCacheTest::$tag', ], ], ];
Neat 页面缓存会自动根据指定的依赖项创建链式依赖项,以防止页面缓存期间的狗群效应。
测试
将测试配置 main-local.php.sample
复制到 main-local.php
并运行
$ phpunit
安全
如果您发现任何与安全相关的问题,请通过电子邮件 pahanini@gmail.com 联系,而不是使用问题跟踪器。
许可
BSD 许可。