рдЕрдм рдореИрдВ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ / рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдХрд╣рддреЗ рд╣реИрдВ, "рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ"ред рд╕рд╛рде рд╣реА, рдХрд╛рдо рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдореВрд▓ рд░реВрдк рд╕реЗ рдмреЗрд╣рдж рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдп рдХреЗ рдмреАрдЪ, рдПрдХ рдХреИрд╢ рдЦрд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдореБрдЦреНрдп рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╣реИред рдореИрдВ рдиреНрдпреВрдирддрдо рд░рдХреНрдд рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рддрд╛ рдерд╛ред рдПрдХ рдмрд┐рдВрджреБ рдкрд░, рдлреЙрд░реНрдо рдХреЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реБрдП рдердХ рдЧрдП
$query = "Select something"; $result = $cache->get($query, $tag); if (!$result) { $result = $db->queryAll($query); $cache->set($query, $tag); }
рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдЪрд╛рд╣рд┐рдПред рдмреЗрд╢рдХ, рдЖрдк рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдб рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдмрд╛рдК рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП (рдФрд░ рд╡рд╣рд╛рдБ рдХреЗрд╡рд▓ $ db-> queryAll рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк) рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдФрд░ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА / рд╡рд┐рдзрд┐ред
рджреВрд╕рд░реА рдУрд░, рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рд╕реАрдзреЗ рдХреИрд╢рд┐рдВрдЧ рдХреЛрдб рдЬреЛрдбрд╝рдирд╛ рднреА рдмрд╣реБрдд рд╕рд╣реА рдирд╣реАрдВ рд╣реИ - рдЕрдВрдд рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐
рд▓рдХреНрд╖рдг рднреА рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ)ред рдПрдХ рдЕрд▓рдЧ рдХреИрд╢ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдирд╛ рднреА рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдПрдХ рдПрдХрд▓, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣ рдПрдХ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдПрдХ "рдЬрд╛рджреВ" рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдирдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░рд╣реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдирдпрд╛ (рдХреИрд╢рд┐рдВрдЧ) рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП: рдХреИрд╢реНрдб рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП * рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧреЗрдЯрдбрд╛рдЯрд╛ () рд╡рд┐рдзрд┐ рдереА, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдХреИрд╢реНрдбрдЧреЗрдЯрдбрд╛рдЯрд╛ () рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдЯрдбрд╛рдЯрд╛ () рдХреЗ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред рдбреЗрдХреЛрд░реЗрдЯрд░ "рдЬрд╛рджреВ" рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдХрд░реЗрдЧрд╛ред
рддреЛ, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
class CachingDecorator { protected $obj; protected $cache; protected $cacheTag; public function __construct($object, $cache, $cacheTag = 'query') { $this->obj = $object; $this->cache = $cache; $this->cacheTag = $cacheTag; } }
рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
$data = new CachingDecorator($data, $cache, 'remote');
рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ, рд╣рдорд╛рд░рд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рд╕рдЬрд╛рдпрд╛ рд╣реБрдЖ рд╡рд╕реНрддреБ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЬрд╛рджреВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ (рдЧреЗрдЯрд░реНрд╕ / рд╕реЗрдЯрд░рд░реНрд╕, рдХреЙрд▓ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ):
public function __get($name) { return $this->obj->$name; } public function __set($name, $value) { return $this->obj->$name = $value; } public function __call($name, $args) { return call_user_func_array(array($this->obj, $name), $args); }
рдЦреИрд░, рдЕрдм рд╡рд╕реНрддреБ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдХреЗ рд╕рдорд╛рди рд╣реИ (рдареАрдХ рд╣реИ, рд▓рдЧрднрдЧ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрджрд┐ рдЖрдк рдХреБрдЫ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рджреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ)ред
рдЖрдорддреМрд░ рдкрд░, рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рд╕рд░рд▓ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рджреВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:
public function __call($name, $args) { if (strtolower(substr($name, 0, 6)) == 'cached') { $name = substr($name, 6); $cacheName = md5(serialize($args)); $result = $this->cache->get($cacheName, $this->cacheTag); if ($result === false) { $result = call_user_func_array(array($this->obj, $name), $args); $this->cache->save($result, $cacheName, $this->cacheTag); } return $result; } else { return call_user_func_array(array($this->obj, $name), $args); } }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫред рдЕрдм, рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
$result = $data->getDataById($id);
рдмрд╕:
$result = $data->cachedGetDataById($id);
рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдмрд╛рдЧрд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдкрдбреЗрдЯ: рдпрд╣рд╛рдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдИрдореЗрд▓ рдореЗрдВ рд╡реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓рдЪреАрд▓рд╛рдкрди рдЦреЛ рдЧрдпрд╛ рд╣реИ, рдХреИрд╢ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдХреИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ * рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдлрд╝рдВрдХреНрд╢рдиред рдпрд╛ рдЕрдзрд┐рдХ рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдХреИрд╢ рдЬреАрд╡рдирдХрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FastCached * рдФрд░ slowCached * (рдХреНрд░рдорд╢рдГ рдФрд░ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЕрджреНрдпрддрди рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП)ред