рдЯреИрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд▓рд░реНрдирд┐рдВрдЧ рдЬрд╝реЗрдВрдб рдореЗрдореЗрдЪреЗ

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

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

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


Tags_Container тАУ , .
MemcacheTag1, MemcacheTag2 MemcacheTagN тАУ , Tags_Container , .


рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдкрдиреА рдмреИрдХрдПрдВрдб рдлрд╝рд╛рдЗрд▓ My_Cache_Backend_Memcached рдмрдирд╛рдПрдБ
 class My_Cache_Backend_Memcached extends Zend_Cache_Backend_Memcached { /** * @const string */ const TAGS_CONTAINER_NAME = 'Tags_Container'; /** * @return array */ protected function _getTagsContainer() { $tagsContainer = $this->load(self::TAGS_CONTAINER_NAME); if (false === $tagsContainer) { $tagsContainer = array(); } if (is_string($tagsContainer)) { $tagsContainer = array($tagsContainer); } return $tagsContainer; } /** * @param $tagName * * @return array */ protected function _getIdsByTag($tagName) { $tagIds = $this->load($tagName); if (false === $tagIds) { $tagIds = array(); } if (is_string($tagIds)) { $tagIds = array($tagIds); } return $tagIds; } /** * Save some string datas into a cache record * * Note : $data is always "string" (serialization is done by the * core not by the backend) * * @param string $data Datas to cache * @param string $id Cache id * @param array $tags Array of strings, the cache record will be tagged * by each string entry * @param bool|int $specificLifetime If != false, set a specific lifetime * for this cache record (null => infinite lifetime) * @return bool True if no problem */ public function save($data, $id, $tags = array(), $specificLifetime = false) { $lifetime = $this->getLifetime($specificLifetime); $tagsLifetime = $this->getLifetime(false); if ($lifetime > $tagsLifetime) { $tagsLifetime = $lifetime; } if ($this->_options['compression']) { $flag = MEMCACHE_COMPRESSED; } else { $flag = 0; } $result = true; if (count($tags) > 0) { $tagsContainer = $this->_getTagsContainer(); $containerChanged = false; foreach($tags as $tagName) { if ($tagName == self::TAGS_CONTAINER_NAME) { Zend_Cache::throwException('Incorrect name tag "' . $tagName . '"'); } if (in_array($id, $tagsContainer)) { Zend_Cache::throwException('The key with id = "' . $id . '" already used in the tags'); } if (!in_array($tagName, $tagsContainer)) { $containerChanged = true; $tagsContainer[] = $tagName; } $tagIds = $this->_getIdsByTag($tagName); if (!in_array($id, $tagIds)) { $tagIds[] = $id; } $result = $result && @$this->_memcache->set( $tagName, array($tagIds), $flag, $tagsLifetime ); } if ($containerChanged) { $result = $result && @$this->_memcache->set( self::TAGS_CONTAINER_NAME, array($tagsContainer), $flag, $tagsLifetime ); } } // ZF-8856: using set because add needs a second request if item already exists $result = $result && @$this->_memcache->set( $id, array($data, time(), $lifetime), $flag, $lifetime ); return $result; } /** * @param string $mode * @param array $tags * * @return array */ protected function _get($mode, $tags = array()) { if (is_string($tags)) { $tags = array($tags); } $tagNames = $this->_getTagsContainer(); switch($mode) { case 'ids': break; case 'tags': $tagNames = array_intersect($tagNames, $tags); break; case 'matching': $tagNames = array_intersect($tagNames, $tags); break; case 'notMatching': $tagNames = array_diff($tagNames, $tags); break; default: Zend_Cache::throwException('Invalid mode for _get() method'); break; } $ids = array(); foreach($tagNames as $tagName) { $ids = array_merge($this->_getIdsByTag($tagName), $ids); } return $ids; } /** * Return an array of stored cache ids * * @return array */ public function getIds() { return $this->_get('ids', array()); } /** * Return an array of stored tags * * @return array */ public function getTags() { return $this->_get('tags', array()); } /** * Return an array of stored cache ids which match given tags * * In case of multiple tags, a logical AND is made between tags * * @param array $tags array of tags * * @return array */ public function getIdsMatchingTags($tags = array()) { return $this->_get('matching', $tags); } /** * Return an array of stored cache ids which don't match given tags * * In case of multiple tags, a logical OR is made between tags * * @param array $tags array of tags * * @return array */ public function getIdsNotMatchingTags($tags = array()) { return $this->_get('notMatching', $tags); } /** * Return an associative array of capabilities (booleans) of the backend * * @return array associative of with capabilities */ public function getCapabilities() { $capabilities = parent::getCapabilities(); $capabilities['tags'] = true; return $capabilities; } /** * @param string $mode * @param array $tags * * @return bool */ protected function _clean($mode, $tags) { $result = false; switch ($mode) { case Zend_Cache::CLEANING_MODE_ALL: $result = $this->_memcache->flush(); break; case Zend_Cache::CLEANING_MODE_MATCHING_TAG: $ids = $this->getIdsMatchingTags($tags); $result = true; foreach($ids as $id) { $result = $result && $this->remove($id); } break; case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG: $ids = $this->getIdsNotMatchingTags($tags); $result = true; foreach($ids as $id) { $result = $result && $this->remove($id); } break; case Zend_Cache::CLEANING_MODE_OLD: case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG: $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_MEMCACHED_BACKEND); break; default: Zend_Cache::throwException('Invalid mode for clean() method'); break; } return $result; } /** * @param string $mode * @param array $tags * * @return mixed */ public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) { return $this->_clean($mode, $tags); } } 

рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓?

рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯрдПрдВрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗрд╡рд▓ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

 $frontendName = 'Class'; $backendName = 'My_Cache_Backend_Memcached'; $frontendOptions = array(); $memcacheDataObject1 = new Default_Models_MemcacheData1; $memcacheDataObject2 = new Default_Models_MemcacheData2; $backendOptions = array( 'servers' => array( array( 'host' => '127.0.0.1', 'port' => '11211', 'persistent' => 1, 'weight' => 5, 'timeout' => 5, 'retry_interval' => 15 ) ) ); $frontendOptions['cached_entity'] = $memcacheDataObject1; $cachedObject1 = Zend_Cache::factory( $frontendName, $backendName, $frontendOptions, $backendOptions, false, true ); $cachedObject1->setTagsArray(array('Memcached_Tag1')); $frontendOptions['cached_entity'] = $memcacheDataObject2; $cachedObject2 = Zend_Cache::factory( $frontendName, $backendName, $frontendOptions, $backendOptions, false, true ); $cachedObject2->setTagsArray(array('Memcached_Tag2')); 

рдорд╛рдирдХ "рдореЗрдордХреЗрдЪреНрдб" рдмреИрдХрдПрдВрдб рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдмреИрдХрдПрдВрдб рдХреНрд▓рд╛рд╕ "My_Cache_Backend_Memcached" рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЖрдкрдХреЛ $ customBackendNaming = true рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдлреИрдХреНрдЯреНрд░реА Zend_Cache :: factory рдореЗрдВ 6 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред

Default_Models_MemcacheData1 рдФрд░ Default_Models_MemcacheData2 рд╣рдорд╛рд░реА рдХреИрд╢реНрдб рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИрдВред рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ:
 class Default_Models_MemcacheData1 { public function cachedMethod() { return rand(111, 999); } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреИрд╢реНрдореЗрдереЛрдб рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 for ($i = 0; $i < 3; $i++) { Zend_Debug::dump($memcacheDataObject1->cachedMethod(), 'cached data:'); } for ($i = 0; $i < 3; $i++) { Zend_Debug::dump($memcacheDataObject2->cachedMethod(), 'cached data:'); } 

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:
cached data: int(468)
cached data: int(676)
ached data: int(721)
ached data: int(182)
cached data: int(414)
cached data: int(561)


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдХрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдХреИрд╢ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
 for ($i = 0; $i < 3; $i++) { Zend_Debug::dump($cachedObject1->cachedMethod(), 'cached data:'); } for ($i = 0; $i < 3; $i++) { Zend_Debug::dump($cachedObject2->cachedMethod(), 'cached data:'); } 

рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рдПрдЧреА, рд╣рдореЗрдВ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдВрдХрдбрд╝реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ:
cached data: int(901)
cached data: int(901)
cached data: int(901)
cached data: int(865)
cached data: int(865)
cached data: int(865)


рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИред

рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 $cachedClass1->clean( Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('Memcached_Tag1') ); 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдВрдЪрд░рд┐рдд рдЯреИрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреИрд╢ рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЪрдпрдирд╛рддреНрдордХ рдХреИрд╢ рд╕рдлрд╛рдИ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИред

* рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рд╣реЙрдоред рдЕрдм рдЯреИрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рдирдХрд╛рд▓ рдХреА рдЧрдгрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ рдпрд╛ рдпрджрд┐ рдкрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ $ specificLifetime рд▓рдВрдмрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреЛрдбрд╝ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрдВрдЯреЗрдирд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ, рдпрджрд┐ рдЯреИрдЧ рдмрджрд▓ рдЧрдП рд╣реИрдВред

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

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


All Articles