Yii рдореЗрдВ рдХреИрд╢ рдЯреИрдЧ рдХрд░рдирд╛

Yii рдореЗрдВ, рдХреИрд╢ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВред рдореИрдВ рдХреИрд╢ рдХреЛ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдЬрдм рдЖрдк рдХрд┐рд╕реА рднреА рдЯреИрдЧ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рддреЛ рдЗрд╕ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рдВрдкреВрд░реНрдг рдХреИрд╢ рдкреБрд░рд╛рдирд╛ рд╣реЛ рдЬрд╛рдПред
Googling рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд▓реЗрдЦ рдорд┐рд▓реЗ:

рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдПрдХрд▓ рдЯреИрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЯреИрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрдгрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ рднреА рдЯреИрдЧ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛, рдЗрд╕ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рддреБрдЪреНрдЫ рд▓рдЧрддрд╛ рд╣реИред
рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░, рдореИрдВрдиреЗ Dklab_Cache_Backend_TagEmuWrapper рдкрд░ YI рдХреА рд╢реИрд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рд▓рд┐рдЦрд╛ред

рдореИрдВ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  1. рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп (рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ) рдХреЛ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЯреИрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдЯреИрдЧ рд╣рдЯрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
  3. рдЬрдм рдХреЛрдИ рдЯреИрдЧ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рдВрдкреВрд░реНрдг рдХреИрд╢ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
  1. рдЯреИрдЧ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
  2. рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде, рдЙрди рдЯреИрдЧреЛрдВ рдХреА рд╕реВрдЪреА, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдпрд╣ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред
  3. рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЙрди рд╕рднреА рдЯреИрдЧ рдХреЛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЯреИрдЧ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ

рдореИрдВ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЕрдВрддрд┐рдо рддреАрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХреБрдВрдЬреА "рдХреБрдВрдЬреА" рдФрд░ рдорд╛рди "рдорд╛рди" рдХреЗ рд╕рд╛рде рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЛ "рдЯреИрдЧ", "рдЯреИрдЧрдмреА" рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
$dependency = new \Cache\Tagged\Dependency(array('tagA', 'tagB')); Yii::app()->cache->set('key', 'value', 0, $dependency); 

рдЙрд╕реА рд╕рдордп, рддреАрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдХреИрд╢ рдореЗрдВ рд╕рд╣реЗрдЬреА рдЬрд╛рддреА рд╣реИрдВ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, Yii рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗред (рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╣рд╛рдБ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддрд╛рдХрд┐ рдкрд╛рда рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред)

рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдордиреЗ рдХреИрд╢ рдПрдВрдЯреНрд░реА рдкрдврд╝реАред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрджрдо рдЙрдард╛рдП рдЧрдП рд╣реИрдВ:
  1. рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдЪрд┐рдкрдХреЗ рдЯреИрдЧ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ
  3. рдХреИрд╢ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рдЯреИрдЧ рдХреА рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдЯреИрдЧ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
  4. рдпрджрд┐ рдЯреИрдЧ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╢ рдкреБрд░рд╛рдирд╛ рд╣реИ

рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:
 /** * 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')); 

рд╕рдВрдкреВрд░реНрдг рдЦреБрд╢реА рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ CActiveRecord рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рдХреИрд╢ рдХрд░реЗрдВрдЧреЗред (рдЖрдкрдХреЛ рдХрд╣реАрдВ рдирдИ рдХрдХреНрд╖рд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рд╕реЗ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд / рдШрдЯрдХ / ActiveRecord.php рдмрдирд╛рдПрдБ:
 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(); } } 

рд╣рдо рдЗрд╕реЗ CActiveRecord рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдХрдореА рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/In159079/


All Articles