рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛрд╣рди 3.1 рдврд╛рдВрдЪреЗ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЦрд╛рддрд╛ рдФрд░ рдХрдИ рдЕрдкрдВрдЬреАрдХреГрдд рдкрд╛рдардХ рдорд╛рди рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреАрдмреАрдПрдордПрд╕ рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдирдП рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рдкреБрд░рд╛рдиреЗ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдкрд░ рддреБрд░рдВрдд рдХреИрд╢ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдпрд╣ рд╕рдм рджреЗрдЦрддреЗ рд╣реБрдП, рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдереАрдВ:
- рдХреИрд╢ рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд╕реА рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдФрд░ DBMS рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╕рд╛рдЗрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рдЬрд┐рдирдХреЗ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрдЯрд▓реЙрдЧ рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп, рдпрд╣ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рдХреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдХреИрд╢)ред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреИрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдирдИ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдХреИрд╢ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ "рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛" рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ред
рдорд╛рдирдХ
Cache_File
рд╡рд░реНрдЧ рдЯреИрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ
Cache_File
, рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЗрд╕реЗ
JetCache
рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд░реНрдЧ рдХреЛ "рдХреБрдВрд╡рд╛рд░рд╛" рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдмреИрдВрдХ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬрдм рдореЙрдбрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
$this->cache = JetCache::instance();
рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реНрд░реЗрдгреА рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдбреЗрдЯрд╛ рдХреИрд╢ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ (рдпрд╣рд╛рдВ рдХреБрдЫ рддрд░реНрдХ рдФрд░ рдХреБрдЫ рдХреЛрдб рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВ):
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреБрдВрдЬреА
$key = 'filebank_get_files'.$rubricId
рдФрд░ рдЯреИрдЧ "filebank_rubrics" рдФрд░ "filebank_files" рдЯреИрдЧ, рдЕрд░реНрдерд╛рддреН, рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реАрдзреЗ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реНрд░реЗрдгреА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
cacheRegExp
рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ (рдХреБрдВрдЬрд┐рдпреЛрдВ) рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдирд┐рдХрд╛рд▓рдиреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЪреЗрдХ рдбрдмрд▓ рд╣реИ: рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪреЗрдВ, рдлрд┐рд░ рдЯреИрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
protected $cacheRegExp = '/^filebank/';
рдпрд╣реА рд╣реИ, рд░реВрдмреНрд░рд┐рдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд░реБрдмреНрд░рд┐рдХ рдореЗрдВ рд░реБрдмреНрд░рд┐рдХреНрд╕ рдФрд░ рдкреЛрдЬрд╝рд┐рд╢рди рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЗрдЯрд╛ рдХрд╛ рдХреИрд╢ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рдердорд┐рдХ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдХреИрд╢рд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрддрд░ рдкрд░, рдЖрдк рдлрд╝рд╛рдЗрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рд╛рде рдорд╛рдирдХ "рдХреИрд╢" рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдХреИрд╢ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЙрдЪреНрдЪ рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рд╢реЗрд╖ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреНрд░рд╛рдЗрд╡рд░ "рдореЗрдореНрдХреЗрдб-рдЯреИрдЧ" рдпрд╛ "рдПрдХреНрд╕рдЪреЗ" рдореЙрдбреНрдпреВрд▓ "рдХреИрд╢"ред рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рдХреИрд╢рд┐рдВрдЧ рдЯреВрд▓ рдкреНрд░рджрд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢рд╛рд╕рд┐рдд рдЫреЛрдЯреА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЬрд┐рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреИрд╢ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рд╡реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
, (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); } } }