рдХреЛрд╣рд╛рдирд╛ 3 рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдХреИрд╢ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛрд╣рди 3.1 рдврд╛рдВрдЪреЗ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЦрд╛рддрд╛ рдФрд░ рдХрдИ рдЕрдкрдВрдЬреАрдХреГрдд рдкрд╛рдардХ рдорд╛рди рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

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

рдпрд╣ рд╕рдм рджреЗрдЦрддреЗ рд╣реБрдП, рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдереАрдВ:

рдорд╛рдирдХ Cache_File рд╡рд░реНрдЧ рдЯреИрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ Cache_File , рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЗрд╕реЗ JetCache рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

 $this->cache = JetCache::instance(); 


рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реНрд░реЗрдгреА рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдбреЗрдЯрд╛ рдХреИрд╢ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ (рдпрд╣рд╛рдВ рдХреБрдЫ рддрд░реНрдХ рдФрд░ рдХреБрдЫ рдХреЛрдб рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВ):

  //    /** * * @param int $rubricId Id    * @return array */ public function getFiles($rubricId) { //!!!  ,      , //   $key = 'filebank_get_files'.$rubricId; $arResult = $this->cache->get($key); if (is_array($arResult)) { return $arResult; } $arResult = array(); $arParams = array(); $arParams[':rubricId'] = $rubricId; $query = " SELECT * FROM `filebank_files` WHERE `rubric_id`=:rubricId ORDER BY `time` DESC, `name` ASC "; $arResult['files'] = DB::query(Database::SELECT, $query) ->parameters($arParams) ->execute() ->as_array(); //!!!      $this->cache->set($key, $arResult, array('filebank_rubrics', 'filebank_files')); return $arResult; } 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреБрдВрдЬреА $key = 'filebank_get_files'.$rubricId рдФрд░ рдЯреИрдЧ "filebank_rubrics" рдФрд░ "filebank_files" рдЯреИрдЧ, рдЕрд░реНрдерд╛рддреН, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реАрдзреЗ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

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

  protected $cacheRegExp = '/^filebank/'; //  public function delRubric($rubricId) { $query = ' SELECT `name` FROM `filebank_files` WHERE `rubric_id`=:rubricId '; $arFiles = DB::query(Database::SELECT, $query) ->param(':rubricId', $rubricId) ->execute() ->as_array(); $arFiles = Arr::path($arFiles, '*.name'); $this->delFiles($arFiles); $query = ' DELETE FROM `filebank_rubrics` WHERE `rubric_id`=:rubricId '; DB::query(Database::DELETE, $query) ->param(':rubricId', $rubricId) ->execute(); //!!!     $tags = array('filebank_rubrics', 'filebank_files'); $this->cache->delete_by_tags($tags, $this->cacheRegExp); } 

рдпрд╣реА рд╣реИ, рд░реВрдмреНрд░рд┐рдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд░реБрдмреНрд░рд┐рдХ рдореЗрдВ рд░реБрдмреНрд░рд┐рдХреНрд╕ рдФрд░ рдкреЛрдЬрд╝рд┐рд╢рди рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЗрдЯрд╛ рдХрд╛ рдХреИрд╢ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рдердорд┐рдХ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдХреИрд╢рд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрддрд░ рдкрд░, рдЖрдк рдлрд╝рд╛рдЗрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ "рдХреИрд╢" рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЬрд┐рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреИрд╢ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рд╡реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
, (unix timestamp)\n
\n
\n


рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдкреВрд░рд╛ рдХреНрд▓рд╛рд╕ рдХреЛрдб рджреВрдВрдЧрд╛:
 <?php defined('SYSPATH') or die('No direct access allowed.'); class JetCache { protected static $instance = NULL; protected static $config; protected static $cache_dir; protected static $cache_time; public static function instance() { if (is_null(self::$instance)) { self::$instance = new self(); } return self::$instance; } protected function __construct() { self::$config = Kohana::config('jethelix')->default; self::$cache_dir = self::$config['jet_cache_dir']; if (!is_dir(self::$cache_dir)) { $oldUmask = umask(0000); if (!mkdir(self::$cache_dir, 0777, TRUE)) { $message = '    JetCache'; throw new Exception($message); } umask($oldUmask); } self::$cache_time = self::$config['jet_cache']; } protected function __clone() { } public function set($id, $data, array $tags=array(), $lifetime=NULL) { if (!$lifetime) { $lifetime = self::$cache_time; } $filename = self::$cache_dir . '/' . $id . '.txt'; $expires = time() + (int)$lifetime; $tagString = implode(',', $tags); $serData = serialize($data); $content = $expires . "\n" . $tagString . "\n" . $serData; try { file_put_contents($filename, $content); } catch (Exception $e) { return FALSE; } return TRUE; } public function get($id) { $filename = self::$cache_dir . '/' . $id . '.txt'; if (!is_file($filename)) { return NULL; } try { $content = file_get_contents($filename); } catch (Exception $e) { return NULL; } $arContent = explode("\n", $content); unset ($content); try { if ($arContent[0] < time()) { return NULL; } $data = unserialize($arContent[2]); return $data; } catch (Exception $e) { return NULL; } } public function delete($id) { $filename = self::$cache_dir . '/' . $id . '.txt'; try { unlink($filename); } catch (Exception $e) { return FALSE; } return TRUE; } public function garbage_collect() { $dir = opendir(self::$cache_dir); while ($file = readdir($dir)) { $fullName = self::$cache_dir . '/'. $file; if (!is_file($fullName)) { continue; } try { $this->_deleteIfExpires($fullName); } catch (Exception $e) { return FALSE; } } return TRUE; } protected function _deleteIfExpires($filename) { $fhandle = fopen($filename, 'r'); $expires = (int)fgets($fhandle); fclose($fhandle); if ($expires < time()) { unlink($filename); } } public function delete_by_tags(array $tags, $filenameRegExp=NULL) { $this->garbage_collect(); try { $arFiles = $this->_getTaggedFiles($tags, $filenameRegExp); $this->_deleteFiles($arFiles); } catch (Exception $e) { return FALSE; } return TRUE; } protected function _getTaggedFiles(array $needTags, $filenameRegExp) { $taggedFiles = array(); $dir = opendir(self::$cache_dir); while ($file = readdir($dir)) { $fullName = self::$cache_dir . '/' . $file; if (!is_file($fullName)) { continue; } if ($filenameRegExp && !preg_match($filenameRegExp, $file)) { continue; } $hasTags = $this->_getTagsFromFile($fullName); $isValid = $this->_tagsValidate($needTags, $hasTags); if ($isValid) { $taggedFiles[] = $fullName; } } return $taggedFiles; } protected function _getTagsFromFile($filename) { $fhandler = fopen($filename, 'r'); fgets($fhandler); $tagString = fgets($fhandler); fclose($fhandler); $tagString = trim($tagString); $arTags = explode(',', $tagString); return $arTags; } protected function _tagsValidate(array $needTags, array $hasTags) { foreach ($needTags as $tag) { if (in_array($tag, $hasTags)) { return TRUE; } } return FALSE; } protected function _deleteFiles(array $files) { foreach ($files as $filename) { unlink($filename); } } } 

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


All Articles