$dependency = new \Cache\Tagged\Dependency(array('tagA', 'tagB')); Yii::app()->cache->set('key', 'value', 0, $dependency);  /** * protected/components/cache/Tagged/Dependency.php */ namespace Cache\Tagged; class Dependency implements \ICacheDependency { //  ,    public $_tags = null; //      \ICache public $_backend; //     public $_tag_versions = null; /** *     ,    */ function __construct(array $tags) { $this->_tags = $tags; } function initBackend() { $this->_backend = \Yii::app()->cache; } /** *        . *              property:_tags */ public function evaluateDependency() { $this->initBackend(); $this->_tag_versions = null; if($this->_tags === null || !is_array($this->_tags)) { return; } if (!$this->_backend) return; $tagsWithVersion = array(); foreach ($this->_tags as $tag) { $mangledTag = Helper::mangleTag($tag); $tagVersion = $this->_backend->get($mangledTag); if ($tagVersion === false) { $tagVersion = Helper::generateNewTagVersion(); $this->_backend->set($mangledTag, $tagVersion, 0); } $tagsWithVersion[$tag] = $tagVersion; } $this->_tag_versions = $tagsWithVersion; return; } /** *  true,     */ public function getHasChanged() { $this->initBackend(); if ($this->_tag_versions === null || !is_array($this->_tag_versions)) { return true; } //          $allMangledTagValues = $this->_backend->mget(Helper::mangleTags(array_keys($this->_tag_versions))); //     dependency. ..  foreach ($this->_tag_versions as $tag => $savedTagVersion) { $mangleTag = Helper::mangleTag($tag); //   "",     if (!isset($allMangledTagValues[$mangleTag])) { return true; } $actualTagVersion = $allMangledTagValues[$mangleTag]; //    ,    if ($actualTagVersion !== $savedTagVersion) { return true; } } return false; } }  namespace Cache\Tagged; /** * protected/components/cache/Tagged/Helper.php */ class Helper { const VERSION = "0.01"; static private $_cache = null; static public function init(\ICache $cacheId = null) { if ($cacheId === null) { if (self::$_cache !== null) { return true; } //       self::$_cache = \Yii::app()->cache; } else { self::$_cache = $cacheId; } return (self::$_cache !== null); } /** *    *       ,    */ static public function deleteByTags($tags = array()) { if (!self::init()) return false; if (is_string($tags)) { $tags = array($tags); } if (is_array($tags)) { foreach ($tags as $tag) { self::$_cache->delete(self::mangleTag($tag)); } } return true; } /** *       */ static public function mangleTag($tag) { return get_called_class() . "_" . self::VERSION . "_" . $tag; } /** *   mangleTag        * @see self::_mangleTag */ static public function mangleTags($tags) { foreach ($tags as $i => $tag) { $tags[$i] = self::mangleTag($tag); } return $tags; } /** *        */ static public function generateNewTagVersion() { static $counter = 0; $counter++; return md5(microtime() . getmypid() . uniqid('')) . '_' . $counter; } }  Yii::setPathOfAlias('Cache', $basepath . DIRECTORY_SEPARATOR . 'components/cache');  //        $cache = \Yii::app()->cache; //     $dependency = new \Cache\Tagged\Dependency(array('c', 'd', 'e')); //         $cache->set('LetterA', 'A', 0, $dependency); // ,      var_dump($cache->get('LetterA')); //   (      ) \Cache\Tagged\Helper::deleteByTags(array('d')); // ,       var_dump($cache->get('LetterA'));  class ActiveRecord extends CActiveRecord { //    const CACHE_DURATION = 0; protected function beforeFind() { $tags = array($this->tableName()); $this->cache(self::CACHE_DURATION, new \Cache\Tagged\Dependency(array($tags))); parent::beforeFind(); } protected function afterSave() { \Cache\Tagged\Helper::deleteByTags($this->tableName()); parent::afterSave(); } protected function afterDelete() { \Cache\Tagged\Helper::deleteByTags($this->tableName()); parent::afterDelete(); } } Source: https://habr.com/ru/post/159079/
All Articles