<?php /** * . * , , * .. . */ interface InvalidateModels { public function getInvalidateTime(); public function getInvalidateField(); }
class Airport extends ActiveRecord implements InvalidateModels { /** * * @return int */ public function getInvalidateTime() { return 60 * 60 * 24; } /** * * @return string */ public function getInvalidateField() { return 'update_stamp'; }
/** * */ class InvalidateCacheController extends \yii\console\Controller { /** * , * \common\interfaces\InvalidateModels * , * * @return array */ private function _getInvalidateModels() { return [ Airport::class, ]; } /** * Action * 1. * 2. * . , * . */ public function actionInvalidateCache() { $models = $this->_getInvalidateModels(); $reflectionObjects = []; foreach ($models as $modelName) { $reflectionObjects[] = new \ReflectionClass($modelName); } /** @var \ReflectionClass $refObject */ foreach ($reflectionObjects as $refObject) { // InvalidateModels if (!$refObject->implementsInterface('\common\interfaces\InvalidateModels')) { continue; } $modelName = $refObject->getName(); /** @var \common\interfaces\InvalidateModels $model */ $model = new $modelName; $invalidateTime = $model->getInvalidateTime(); $cacheKey = 'LastInvalidateTime-' . $refObject->getName(); $lastInvalidateTime = \Yii::$app->memcache->get($cacheKey); if (false === $lastInvalidateTime) { $this->_invalidateCache($refObject); \Yii::$app->memcache->set($cacheKey, 1, $invalidateTime); } } } /** * * * @param \ReflectionClass $refObject */ private function _invalidateCache(\ReflectionClass $refObject) { $modelName = $refObject->getName(); /** @var \common\interfaces\InvalidateModels $model */ $model = new $modelName; $invalidateField = $model->getInvalidateField(); /** @var \yii\db\ActiveRecord $model */ $lastChangedTime = $model::find()->max($invalidateField); $lastDataInCache = \Yii::$app->memcache->get('last-set-time.' . $model::tableName()); // if ($lastDataInCache < strtotime($lastChangedTime)) { \Yii::$app->memcache->invalidateTags([$model::tableName()]); } } }
Source: https://habr.com/ru/post/307092/