{"id":214645,"date":"2014-03-05T11:31:04","date_gmt":"2014-03-05T07:31:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=214645"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=214645","title":{"rendered":"<span class=\"post_title\">Magento Enterprise: \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Full Page Cache \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043d\u0443\u0436\u0435\u043d<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/12d\/5b4\/b83\/12d5b4b83c0043cefab6d1505764acaa.png\" alt=\"Magento Enterprise - Full Page Cache\"\/><\/p>\n<h2>Magento Enterprise: \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Full Page Cache \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043d\u0443\u0436\u0435\u043d.<\/h2>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 Magento, \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 e-commerce \u0434\u0432\u0438\u0436\u043e\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043d \u043a \u0436\u0435\u043b\u0435\u0437\u0443. \u041d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u00ab\u0443\u0441\u043a\u043e\u0440\u044f\u043b\u043e\u043a\u00bb, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 Magento \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e Magento \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0421\u0440\u0435\u0434\u0438 \u0442\u0430\u043a\u0438\u0445 \u00ab\u0443\u0441\u043a\u043e\u0440\u044f\u043b\u043e\u043a\u00bb \u043a\u0435\u0448\u0438, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 JS\/CSS \u0432 \u043e\u0434\u0438\u043d \u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u0434\u0440.<\/p>\n<p>  \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u00ab\u0444\u0438\u0448\u0435\u043a\u00bb Magento Enterprise \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Full Page Cache (\u0434\u0430\u043b\u0435\u0435 FPC). \u042d\u0442\u0443 \u00ab\u0444\u0438\u0448\u043a\u0443\u00bb \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c Enterprise_PageCache, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043f\u0430\u043a\u0435\u0442\u0430 Magento Enterprise.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430\u044f \u0441\u0432\u0435\u0436\u0430\u044f \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f Magento Enterprise: 1.13.1.<\/p>\n<p>  FPC \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0441\u0435\u0440\u0432\u0435\u0440. \u042f \u043f\u0440\u043e\u0432\u0435\u043b \u0437\u0430\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b), \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/d32\/cad\/23d\/d32cad23d249b8ce6f954ebbde271ded.png\" alt=\"Magento Enterprise - FPC\"\/><\/p>\n<ul>\n<li>65 ms \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c FPC (\u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0431\u044b\u043b\u0438 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u044b);<\/li>\n<li>1250 ms \u043f\u0440\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c FPC (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u043a\u0435\u0448\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b);<\/li>\n<li>2500 ms \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u0435\u0448\u0435 \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u0430? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0427\u0442\u043e \u0438 \u043a\u043e\u0433\u0434\u0430 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 FPC<\/h2>\n<p>  \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, Full Page Cache \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041d\u043e \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, CMS-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441 404 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430). \u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0434\u0443\u043b\u044f (config.xml):<\/p>\n<pre><code class=\"php\">&lt;frontend&gt;     &lt;cache&gt;         &lt;requests&gt;             &lt;_no_route&gt;enterprise_pagecache\/processor_noroute&lt;\/_no_route&gt;             &lt;cms&gt;enterprise_pagecache\/processor_default&lt;\/cms&gt;             &lt;catalog&gt;                 &lt;category&gt;                     &lt;view&gt;enterprise_pagecache\/processor_category&lt;\/view&gt;                 &lt;\/category&gt;             &lt;\/catalog&gt;             &lt;catalog&gt;                 &lt;product&gt;                     &lt;view&gt;enterprise_pagecache\/processor_product&lt;\/view&gt;                 &lt;\/product&gt;             &lt;\/catalog&gt;         &lt;\/requests&gt;     &lt;\/cache&gt; &lt;\/frontend&gt; <\/code><\/pre>\n<p>  \u0412 \u0441\u0435\u043a\u0446\u0438\u0438 frontend\/cache\/requests \u0437\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f frontName \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043c\u043e\u0434\u0443\u043b\u044f (\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e \u043f\u0443\u0442\u0438: frontend\/routers\/route_name\/args\/frontName), \u0437\u0430\u0442\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u044d\u043a\u0448\u0435\u043d (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u044d\u043a\u0448\u0435\u043d \u2014 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b). \u0410 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430 (\u0437\u0430\u043f\u0440\u043e\u0441\u0430).<\/p>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b\/\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\/\u044d\u043a\u0448\u0435\u043d \u0432\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c Enterprise_PageCache. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"php\">&lt;frontend&gt;     &lt;cache&gt;         &lt;requests&gt;             &lt;productinfo&gt;                 &lt;index&gt;enterprise_pagecache\/processor_default&lt;\/index&gt;             &lt;\/productinfo&gt;         &lt;\/requests&gt;     &lt;\/cache&gt; &lt;\/frontend&gt; <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 FPC \u043d\u0435 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u041d\u0435 \u043a\u0435\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, HTTPS \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 GET-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c no_cache. \u041c\u0435\u0442\u043e\u0434\u044b canProcessRequest \u0438 isAllowed \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Processor:<\/p>\n<pre><code class=\"php\">\/**  * Do basic validation for request to be cached  *  * @param Zend_Controller_Request_Http $request  * @return bool  *\/ public function canProcessRequest(Zend_Controller_Request_Http $request) {     $res = $this-&gt;isAllowed();     $res = $res && Mage::app()-&gt;useCache('full_page');     if ($request-&gt;getParam('no_cache')) {         $res = false;     }       if ($res) {         $maxDepth = Mage::getStoreConfig(self::XML_PATH_ALLOWED_DEPTH);         $queryParams = $request-&gt;getQuery();         unset($queryParams[Enterprise_PageCache_Model_Cache::REQUEST_MESSAGE_GET_PARAM]);         $res = count($queryParams) <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"php\">\/**  * Check if processor is allowed for current HTTP request.  * Disable processing HTTPS requests and requests with &quot;NO_CACHE&quot; cookie  *  * @return bool  *\/ public function isAllowed() {     if (!$this-&gt;_requestId) {         return false;     }     if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {         return false;     }     if (isset($_COOKIE['NO_CACHE'])) {         return false;     }     if (isset($_GET['no_cache'])) {         return false;     }     if (isset($_GET[Mage_Core_Model_Session_Abstract::SESSION_ID_QUERY_PARAM])) {         return false;     }     if (!Mage::app()-&gt;useCache('full_page')) {         return false;     }       return true; } <\/code><\/pre>\n<h2>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 FPC<\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f FPC-\u043a\u0435\u0448\u0435\u043c, \u0442\u043e FPC \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u0435\u0448 \u0431\u043b\u043e\u043a\u043e\u0432. \u0421\u043c. \u043c\u0435\u0442\u043e\u0434 processPreDispatch \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Observer, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (event) controller_action_predispatch:<\/p>\n<pre><code class=\"php\">\/**  * Check when cache should be disabled  *  * @param Varien_Event_Observer $observer  * @return Enterprise_PageCache_Model_Observer  *\/ public function processPreDispatch(Varien_Event_Observer $observer) {     if (!$this-&gt;isCacheEnabled()) {         return $this;     }     $action = $observer-&gt;getEvent()-&gt;getControllerAction();     \/* @var $request Mage_Core_Controller_Request_Http *\/     $request = $action-&gt;getRequest();       $noCache = $this-&gt;_getCookie()-&gt;get(Enterprise_PageCache_Model_Processor::NO_CACHE_COOKIE);     if ($noCache) {         Mage::getSingleton('catalog\/session')-&gt;setParamsMemorizeDisabled(false);         $this-&gt;_getCookie()-&gt;renew(Enterprise_PageCache_Model_Processor::NO_CACHE_COOKIE);     } elseif ($action) {         Mage::getSingleton('catalog\/session')-&gt;setParamsMemorizeDisabled(true);     }     \/**      * Check if request will be cached      *\/     if ($this-&gt;_processor-&gt;canProcessRequest($request)) {         Mage::app()-&gt;getCacheInstance()-&gt;banUse(Mage_Core_Block_Abstract::CACHE_GROUP);     }     $this-&gt;_getCookie()-&gt;updateCustomerCookies();     return $this; } <\/code><\/pre>\n<p>  FPC \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0432\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0435\u0448\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u043a\u0435\u0448. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0435\u0448\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d \u043a\u0430\u0441\u0442\u043e\u043c\u0435\u0440 \u0438\u043b\u0438 \u043d\u0435\u0442, \u043a \u043a\u0430\u043a\u0438\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f, \u043a \u043a\u0430\u043a\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043f\u0440. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043c\u043e\u0436\u043d\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 _createRequestIds \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Processor:<\/p>\n<pre><code class=\"php\">\/**  * Populate request ids  * @return Enterprise_PageCache_Model_Processor  *\/ protected function _createRequestIds() {     $uri = $this-&gt;_getFullPageUrl();       \/\/Removing get params     $pieces = explode('?', $uri);     $uri = array_shift($pieces);       \/**      * Define COOKIE state      *\/     if ($uri) {         if (isset($_COOKIE['store'])) {             $uri = $uri.'_'.$_COOKIE['store'];         }         if (isset($_COOKIE['currency'])) {             $uri = $uri.'_'.$_COOKIE['currency'];         }         if (isset($_COOKIE[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_GROUP])) {             $uri .= '_' . $_COOKIE[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_GROUP];         }         if (isset($_COOKIE[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_LOGGED_IN])) {             $uri .= '_' . $_COOKIE[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_LOGGED_IN];         }         if (isset($_COOKIE[Enterprise_PageCache_Model_Cookie::CUSTOMER_SEGMENT_IDS])) {             $uri .= '_' . $_COOKIE[Enterprise_PageCache_Model_Cookie::CUSTOMER_SEGMENT_IDS];         }         if (isset($_COOKIE[Enterprise_PageCache_Model_Cookie::IS_USER_ALLOWED_SAVE_COOKIE])) {             $uri .= '_' . $_COOKIE[Enterprise_PageCache_Model_Cookie::IS_USER_ALLOWED_SAVE_COOKIE];         }         $designPackage = $this-&gt;_getDesignPackage();           if ($designPackage) {             $uri .= '_' . $designPackage;         }     }       $this-&gt;_requestId       = $uri;     $this-&gt;_requestCacheId  = $this-&gt;prepareCacheId($this-&gt;_requestId);       return $this; } <\/code><\/pre>\n<p>  FPC \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u044b. \u041e\u043d\u0438 \u0432 Magento \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 cache.xml \u0432 \u043f\u0430\u043f\u043a\u0435 etc \u043c\u043e\u0434\u0443\u043b\u044f. \u0410 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 FPC (\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0431\u043b\u043e\u043a\u0430 FPC-\u043a\u0435\u0448\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0431\u043b\u043e\u043a\u0430). \u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 cache.xml:<\/p>\n<pre><code class=\"php\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;     &lt;config&gt;         &lt;placeholders&gt;             &lt;turnkeye_popup&gt;                 &lt;block&gt;turnkeye_popup\/popup&lt;\/block&gt;                 &lt;placeholder&gt;POPUP&lt;\/placeholder&gt;                 &lt;container&gt;Turnkeye_Popup_Model_PageCache_Container_Popup&lt;\/container&gt;                 &lt;cache_lifetime&gt;86400&lt;\/cache_lifetime&gt;             &lt;\/turnkeye_popup&gt;         &lt;\/placeholders&gt;     &lt;\/config&gt; <\/code><\/pre>\n<p>  \u041a\u0440\u0430\u0442\u043a\u043e \u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430:<\/p>\n<ul>\n<li>block \u2014 \u0442\u0438\u043f \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u0431\u043b\u043e\u043a\u0430<\/li>\n<li>placeholder \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430<\/li>\n<li>container \u2014 \u0442\u0438\u043f \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430<\/li>\n<li>cache_lifetime \u2014 \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043a\u0435\u0448\u0430<\/li>\n<\/ul>\n<p>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c FPC \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u043e\u043c \u0438 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f: \u043a\u043e\u0433\u0434\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 core_block_abstract_to_html_after, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 renderBlockPlaceholder \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Observer:<\/p>\n<pre><code class=\"php\">\/**  * Render placeholder tags around the block if needed  *  * @param Varien_Event_Observer $observer  * @return Enterprise_PageCache_Model_Observer  *\/ public function renderBlockPlaceholder(Varien_Event_Observer $observer) {     if (!$this-&gt;_isEnabled) {         return $this;     }     $block = $observer-&gt;getEvent()-&gt;getBlock();     $transport = $observer-&gt;getEvent()-&gt;getTransport();     $placeholder = $this-&gt;_config-&gt;getBlockPlaceholder($block);       if ($transport && $placeholder && !$block-&gt;getSkipRenderTag()) {         $blockHtml = $transport-&gt;getHtml();           $request = Mage::app()-&gt;getFrontController()-&gt;getRequest();         \/** @var $processor Enterprise_PageCache_Model_Processor_Default *\/         $processor = $this-&gt;_processor-&gt;getRequestProcessor($request);         if ($processor && $processor-&gt;allowCache($request)) {             $container = $placeholder-&gt;getContainerClass();             if ($container && !Mage::getIsDeveloperMode()) {                 $container = new $container($placeholder);                 $container-&gt;setProcessor(Mage::getSingleton('enterprise_pagecache\/processor'));                 $container-&gt;setPlaceholderBlock($block);                 $container-&gt;saveCache($blockHtml);             }         }           $blockHtml = $placeholder-&gt;getStartTag() . $blockHtml . $placeholder-&gt;getEndTag();         $transport-&gt;setHtml($blockHtml);     }     return $this; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c $placeholder \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Config \u043c\u0435\u0442\u043e\u0434\u043e\u043c getBlockPlaceholder:<\/p>\n<pre><code class=\"php\">\/**  * Create placeholder object based on block information  *  * @param Mage_Core_Block_Abstract $block  * @return Enterprise_PageCache_Model_Container_Placeholder  *\/ public function getBlockPlaceholder($block) {     $this-&gt;_initPlaceholders();     $type = $block-&gt;getType();       if (isset($this-&gt;_placeholders[$type])) {         $placeholderData = false;         foreach ($this-&gt;_placeholders[$type] as $placeholderInfo) {             if (!empty($placeholderInfo['name'])) {                 if ($placeholderInfo['name'] == $block-&gt;getNameInLayout()) {                     $placeholderData = $placeholderInfo;                 }             } else {                 $placeholderData = $placeholderInfo;             }         }           if (!$placeholderData) {             return false;         }           $placeholder = $placeholderData['code']             . ' container=&quot;' . $placeholderData['container'] . '&quot;'             . ' block=&quot;' . get_class($block) . '&quot;';         $placeholder.= ' cache_id=&quot;' . $block-&gt;getCacheKey() . '&quot;';           if (!empty($placeholderData['cache_lifetime'])) {             $placeholder .= ' cache_lifetime=&quot;' . $placeholderData['cache_lifetime'] . '&quot;';         }           foreach ($block-&gt;getCacheKeyInfo() as $k =&gt; $v) {             if (is_string($k) && !empty($k)) {                 $placeholder .= ' ' . $k . '=&quot;' . $v . '&quot;';             }         }         $placeholder = Mage::getModel('enterprise_pagecache\/container_placeholder', $placeholder);         return $placeholder;     }     return false; } <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Container_Placeholder:<\/p>\n<pre><code class=\"php\">\/**  * Class constructor.  * Initialize placeholder name and attributes based on definition  *  * @param string $definition  *\/ public function __construct($definition) {     if ($definition && array_key_exists($definition, self::$_definitionMap)) {         $definition = self::$_definitionMap[$definition];     }     $this-&gt;_definition = $definition;     $definition     = explode(' ', $definition);     $this-&gt;_name    = $definition[0];     $count = count($definition);     if ($count&gt;1) {         for ($i=1; $i_attributes[$info[0]] = isset($info[1]) ? trim($info[1], '&quot;\\'') : null;         }     } } <\/code><\/pre>\n<p>  \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0431\u043b\u043e\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c getAttribute:<\/p>\n<pre><code class=\"php\">\/**  * Get attribute by specific code  * @param $code string  * @return string  *\/ public function getAttribute($code) {     return isset($this-&gt;_attributes[$code]) ? $this-&gt;_attributes[$code] : null; } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0431\u043b\u043e\u043a\u0430:<\/p>\n<pre><code class=\"php\">\/**  * Retrieve placeholder definition hash  *  * @return string  *\/ protected function _getDefinitionHash() {     $definition = $this-&gt;getDefinition();     $result = array_search($definition, self::$_definitionMap);     if ($result === false) {         $result = $this-&gt;getName() . '_' . md5($definition);         self::$_definitionMap[$result] = $definition;     }     return $result; }   \/**  * Get placeholder start tag for block html generation  *  * @return string  *\/ public function getStartTag() {     return '&lt;!--{' . $this-&gt;_getDefinitionHash() . '}--&gt;'; }   \/**  * Get placeholder end tag for block html generation  *  * @return string  *\/ public function getEndTag() {     return '&lt;!--\/{' . $this-&gt;_getDefinitionHash() . '}--&gt;'; } <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0431\u043b\u043e\u043a\u0430:<\/p>\n<pre><code class=\"php\">&lt; !--{TOPMENU_21c7f778e21d072d331836703b6295f5}--&gt; &lt; div class=&quot;nav-container&quot;&gt;     &lt; ul id=&quot;nav&quot;&gt;         &lt; li class=&quot;level0 nav-1 first last level-top&quot;&gt;             &lt; a class=&quot;level-top&quot; href=&quot;http:\/\/example.com\/test-category.html&quot;&gt;                 &lt; span&gt;Test category&lt;\/span&gt;             &lt;\/a&gt;         &lt;\/li&gt;     &lt;\/ul&gt; &lt;\/div&gt; &lt; !--\/{TOPMENU_21c7f778e21d072d331836703b6295f5}--&gt; <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 controller_front_send_response_before \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 cacheResponse \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Observer, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u043a\u0435\u0448, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u041a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 cacheResponse:<\/p>\n<pre><code class=\"php\">\/**  * Save page body to cache storage  *  * @param Varien_Event_Observer $observer  * @return Enterprise_PageCache_Model_Observer  *\/ public function cacheResponse(Varien_Event_Observer $observer) {     if (!$this-&gt;isCacheEnabled()) {         return $this;     }     $frontController = $observer-&gt;getEvent()-&gt;getFront();     $request = $frontController-&gt;getRequest();     $response = $frontController-&gt;getResponse();     $this-&gt;_saveDesignException();     $this-&gt;_processor-&gt;processRequestResponse($request, $response);     return $this; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 processRequestResponse \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u0435\u0448, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e:<\/p>\n<pre><code class=\"php\">\/**  * Process response body by specific request  *  * @param Zend_Controller_Request_Http $request  * @param Zend_Controller_Response_Http $response  * @return Enterprise_PageCache_Model_Processor  *\/ public function processRequestResponse(Zend_Controller_Request_Http $request,     Zend_Controller_Response_Http $response ) {     \/\/ we should add original path info tag as another way we can't drop some entities from cron job     $this-&gt;addRequestTag(Enterprise_PageCache_Helper_Url::prepareRequestPathTag($request-&gt;getOriginalPathInfo()));     $cacheInstance = Enterprise_PageCache_Model_Cache::getCacheInstance();     \/**      * Basic validation for request processing      *\/     if ($this-&gt;canProcessRequest($request)) {         $processor = $this-&gt;getRequestProcessor($request);         if ($processor && $processor-&gt;allowCache($request)) {             $this-&gt;setMetadata('cache_subprocessor', get_class($processor));               $cacheId = $this-&gt;prepareCacheId($processor-&gt;getPageIdInApp($this));             $content = $processor-&gt;prepareContent($response);               \/**              * Replace all occurrences of session_id with unique marker              *\/             Enterprise_PageCache_Helper_Url::replaceSid($content);             Enterprise_PageCache_Helper_Form_Key::replaceFormKey($content);               if (function_exists('gzcompress')) {                 $content = gzcompress($content);             }               $contentSize = strlen($content);             $currentStorageSize = (int) $cacheInstance-&gt;load(self::CACHE_SIZE_KEY);               if (Mage::getStoreConfig(Enterprise_PageCache_Model_Processor::XML_PATH_CACHE_DEBUG)) {                 $response-&gt;setBody(implode(', ', $this-&gt;getRequestTags()) . $response-&gt;getBody());             }               $maxSizeInBytes = Mage::getStoreConfig(self::XML_PATH_CACHE_MAX_SIZE) * 1024 * 1024;               if ($currentStorageSize &gt;= $maxSizeInBytes) {                 Mage::app()-&gt;getCacheInstance()-&gt;invalidateType('full_page');                 return $this;             }               $cacheInstance-&gt;save($content, $cacheId, $this-&gt;getRequestTags());               $cacheInstance-&gt;save(                 $currentStorageSize + $contentSize,                 self::CACHE_SIZE_KEY,                 $this-&gt;getRequestTags()             );               \/*              * Save design change in cache              *\/             $designChange = Mage::getSingleton('core\/design');             if ($designChange-&gt;getData()) {                 $cacheInstance-&gt;save(                     serialize($designChange-&gt;getData()),                     $this-&gt;getRequestCacheId() . self::DESIGN_CHANGE_CACHE_SUFFIX,                     $this-&gt;getRequestTags()                 );             }               \/\/ save response headers             $this-&gt;setMetadata('response_headers', $response-&gt;getHeaders());               \/\/ save original routing info             $this-&gt;setMetadata('routing_aliases', Mage::app()-&gt;getRequest()-&gt;getAliases());             $this-&gt;setMetadata('routing_requested_route', Mage::app()-&gt;getRequest()-&gt;getRequestedRouteName());             $this-&gt;setMetadata('routing_requested_controller',                 Mage::app()-&gt;getRequest()-&gt;getRequestedControllerName());             $this-&gt;setMetadata('routing_requested_action', Mage::app()-&gt;getRequest()-&gt;getRequestedActionName());               $this-&gt;setMetadata('sid_cookie_name', Mage::getSingleton('core\/session')-&gt;getSessionName());               Mage::dispatchEvent('pagecache_processor_metadata_before_save', array('processor' =&gt; $this));               $this-&gt;_saveMetadata();         }           if (isset($_GET[Mage_Core_Model_Session_Abstract::SESSION_ID_QUERY_PARAM])) {             Mage::getSingleton('enterprise_pagecache\/cookie')-&gt;updateCustomerCookies();             Mage::getModel('enterprise_pagecache\/observer')-&gt;updateCustomerProductIndex();           }     }     return $this; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u0435\u0448 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u043e\u043c \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u043e\u0432: $content = $processor-&gt;prepareContent($response);. \u041c\u0435\u0442\u043e\u0434 prepareContent:<\/p>\n<pre><code class=\"php\">\/**  * Prepare response body before caching  *  * @param Zend_Controller_Response_Http $response  * @return string  *\/ public function prepareContent(Zend_Controller_Response_Http $response) {     return $this-&gt;replaceContentToPlaceholderReplacer($response-&gt;getBody()); } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 replaceContentToPlaceholderReplacer:<\/p>\n<pre><code class=\"php\">\/**  * Replace block content to placeholder replacer  *  * @param string $content  * @return string  *\/ public function replaceContentToPlaceholderReplacer($content) {     $placeholders = array();     preg_match_all(         Enterprise_PageCache_Model_Container_Placeholder::HTML_NAME_PATTERN,         $content,         $placeholders,         PREG_PATTERN_ORDER     );     $placeholders = array_unique($placeholders[1]);     try {         foreach ($placeholders as $definition) {             $this-&gt;_placeholder = Mage::getModel('enterprise_pagecache\/container_placeholder', $definition);             $content = preg_replace_callback($this-&gt;_placeholder-&gt;getPattern(),                 array($this, '_getPlaceholderReplacer'), $content);         }         $this-&gt;_placeholder = null;     } catch (Exception $e) {         $this-&gt;_placeholder = null;         throw $e;     }     return $content; } <\/code><\/pre>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u043a\u0435\u0448\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0431\u043b\u043e\u043a\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u042d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0431\u043b\u043e\u043a \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e FPC \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043b\u043e\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430:<\/p>\n<pre><code class=\"php\">&lt; !--{POPUP container=&quot;Turnkeye_Popup_Model_PageCache_Container_Popup&quot; block=&quot;Turnkeye_Popup_Block_Popup&quot; cache_id=&quot;c3b32091a1ebd3b276a8fd70496a8e6da20865d0&quot; cache_lifetime=&quot;86400&quot; template=&quot;turnkeye\/popup\/popup.phtml&quot; handles=&quot;a:2:{i:0;s:15:&quot;cms_index_index&quot;;i:1;s:8:&quot;cms_page&quot;;}&quot; customer_segment_ids=&quot;a:1:{i:0;i:0;}&quot; popup_ids=&quot;a:1:{i:0;s:1:&quot;1&quot;;}&quot; excluded_popup_ids=&quot;a:1:{i:0;i:1;}&quot;}--&gt; <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Magento \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438\u0437 \u043a\u0435\u0448\u0430 (\u0441\u043c. \u043c\u0435\u0442\u043e\u0434 extractContent \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Processor). \u0415\u0441\u043b\u0438 \u0432 \u043a\u0435\u0448\u0435 \u043f\u0443\u0441\u0442\u043e \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 Magento (\u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e FPC \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e) \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u0435\u0448 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0435\u0441\u0442\u044c \u0432 \u043a\u0435\u0448\u0435, \u0442\u043e FPC \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u0435\u0448\u0430.<\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434\u044b _processContent \u0438 _processContainers \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Processor:<\/p>\n<pre><code class=\"php\">\/**  * Determine and process all defined containers.  * Direct request to pagecache\/request\/process action if necessary for additional processing  *  * @param string $content  * @return string|false  *\/ protected function _processContent($content) {     $containers = $this-&gt;_processContainers($content);     $isProcessed = empty($containers);     \/\/ renew session cookie     $sessionInfo = Enterprise_PageCache_Model_Cache::getCacheInstance()-&gt;load($this-&gt;getSessionInfoCacheId());       if ($sessionInfo) {         $sessionInfo = unserialize($sessionInfo);         foreach ($sessionInfo as $cookieName =&gt; $cookieInfo) {             if (isset($_COOKIE[$cookieName]) && isset($cookieInfo['lifetime'])                 && isset($cookieInfo['path']) && isset($cookieInfo['domain'])                 && isset($cookieInfo['secure']) && isset($cookieInfo['httponly'])             ) {                 $lifeTime = (0 == $cookieInfo['lifetime']) ? 0 : time() + $cookieInfo['lifetime'];                 setcookie($cookieName, $_COOKIE[$cookieName], $lifeTime,                     $cookieInfo['path'], $cookieInfo['domain'],                     $cookieInfo['secure'], $cookieInfo['httponly']                 );             }         }     } else {         $isProcessed = false;     }       if (isset($_COOKIE[Enterprise_PageCache_Model_Cookie::COOKIE_FORM_KEY])) {         $formKey = $_COOKIE[Enterprise_PageCache_Model_Cookie::COOKIE_FORM_KEY];     } else {         $formKey = Enterprise_PageCache_Helper_Data::getRandomString(16);         Enterprise_PageCache_Model_Cookie::setFormKeyCookieValue($formKey);     }       Enterprise_PageCache_Helper_Form_Key::restoreFormKey($content, $formKey);       \/**      * restore session_id in content whether content is completely processed or not      *\/     $sidCookieName = $this-&gt;getMetadata('sid_cookie_name');     $sidCookieValue = $sidCookieName && isset($_COOKIE[$sidCookieName]) ? $_COOKIE[$sidCookieName] : '';       \/\/ XSS vulnerability protection provided by htmlspcialchars call - escape & &quot; ' &lt; &gt; chars     Enterprise_PageCache_Helper_Url::restoreSid($content, htmlspecialchars($sidCookieValue, ENT_QUOTES));       if ($isProcessed) {         return $content;     } else {         Mage::register('cached_page_content', $content);         Mage::register('cached_page_containers', $containers);         Mage::app()-&gt;getRequest()             -&gt;setModuleName('pagecache')             -&gt;setControllerName('request')             -&gt;setActionName('process')             -&gt;isStraight(true);           \/\/ restore original routing info         $routingInfo = array(             'aliases'              =&gt; $this-&gt;getMetadata('routing_aliases'),             'requested_route'      =&gt; $this-&gt;getMetadata('routing_requested_route'),             'requested_controller' =&gt; $this-&gt;getMetadata('routing_requested_controller'),             'requested_action'     =&gt; $this-&gt;getMetadata('routing_requested_action')         );           Mage::app()-&gt;getRequest()-&gt;setRoutingInfo($routingInfo);         return false;     } } <\/code><\/pre>\n<pre><code class=\"php\">\/**  * Process Containers  *  * @param $content  * @return array  *\/ protected function _processContainers(&$content) {     $placeholders = array();     preg_match_all(         Enterprise_PageCache_Model_Container_Placeholder::HTML_NAME_PATTERN,         $content, $placeholders, PREG_PATTERN_ORDER     );     $placeholders = array_unique($placeholders[1]);     $containers = array();     foreach ($placeholders as $definition) {         $placeholder = new Enterprise_PageCache_Model_Container_Placeholder($definition);         $container = $placeholder-&gt;getContainerClass();         if (!$container) {             continue;         }           $container = new $container($placeholder);         $container-&gt;setProcessor($this);         if (!$container-&gt;applyWithoutApp($content)) {             $containers[] = $container;         } else {             preg_match($placeholder-&gt;getPattern(), $content, $matches);             if (array_key_exists(1,$matches)) {                 $containers = array_merge($this-&gt;_processContainers($matches[1]), $containers);                 $content = preg_replace($placeholder-&gt;getPattern(), str_replace('$', '\\\\$', $matches[1]), $content);             }         }     }     return $containers; } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u043e\u043a\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u044b. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043d\u0435\u0442 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0431\u043b\u043e\u043a\u0438, \u0442\u043e \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u044b.<\/p>\n<p>  \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u043e\u0432 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c applyWithoutApp. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043b\u043e\u043a\u0430 \u0432 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. \u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 applyWithoutApp, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Container_Abstract:<\/p>\n<pre><code class=\"php\">\/**  * Generate placeholder content before application was initialized and apply to page content if possible  *  * @param string $content  * @return bool  *\/ public function applyWithoutApp(&$content) {     $cacheId = $this-&gt;_getCacheId();       if ($cacheId === false) {         $this-&gt;_applyToContent($content, '');         return true;     }       $block = $this-&gt;_loadCache($cacheId);     if ($block === false) {         return false;     }       $block = Enterprise_PageCache_Helper_Url::replaceUenc($block);     $this-&gt;_applyToContent($content, $block);     return true; } <\/code><\/pre>\n<p>  \u0418\u0437 \u043a\u043e\u0434\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0431\u043b\u043e\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 _getCacheId \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u0431\u044b\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d (applyWithoutApp \u0432\u0435\u0440\u043d\u0443\u043b false), \u0442\u043e \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c (\u0441\u043c. \u043c\u0435\u0442\u043e\u0434 _processContent \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Processor), \u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Magento (\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f Mage::app()). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c Enterprise_PageCache_RequestController \u044d\u043a\u0448\u0435\u043d\u043e\u043c process. \u041a\u043e\u0434 \u044d\u043a\u0448\u0435\u043d\u0430 process:<\/p>\n<pre><code class=\"php\">\/**  * Request processing action  *\/ public function processAction() {     $processor  = Mage::getSingleton('enterprise_pagecache\/processor');     $content    = Mage::registry('cached_page_content');     $containers = Mage::registry('cached_page_containers');     $cacheInstance = Enterprise_PageCache_Model_Cache::getCacheInstance();     foreach ($containers as $container) {         $container-&gt;applyInApp($content);     }     $this-&gt;getResponse()-&gt;appendBody($content);     \/\/ save session cookie lifetime info     $cacheId = $processor-&gt;getSessionInfoCacheId();     $sessionInfo = $cacheInstance-&gt;load($cacheId);     if ($sessionInfo) {         $sessionInfo = unserialize($sessionInfo);     } else {         $sessionInfo = array();     }     $session = Mage::getSingleton('core\/session');     $cookieName = $session-&gt;getSessionName();     $cookieInfo = array(         'lifetime' =&gt; $session-&gt;getCookie()-&gt;getLifetime(),         'path'     =&gt; $session-&gt;getCookie()-&gt;getPath(),         'domain'   =&gt; $session-&gt;getCookie()-&gt;getDomain(),         'secure'   =&gt; $session-&gt;getCookie()-&gt;isSecure(),         'httponly' =&gt; $session-&gt;getCookie()-&gt;getHttponly(),     );     if (!isset($sessionInfo[$cookieName]) || $sessionInfo[$cookieName] != $cookieInfo) {         $sessionInfo[$cookieName] = $cookieInfo;         \/\/ customer cookies have to be refreshed as well as the session cookie         $sessionInfo[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER] = $cookieInfo;         $sessionInfo[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_GROUP] = $cookieInfo;         $sessionInfo[Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER_LOGGED_IN] = $cookieInfo;         $sessionInfo[Enterprise_PageCache_Model_Cookie::CUSTOMER_SEGMENT_IDS] = $cookieInfo;         $sessionInfo[Enterprise_PageCache_Model_Cookie::COOKIE_MESSAGE] = $cookieInfo;         $sessionInfo = serialize($sessionInfo);         $cacheInstance-&gt;save($sessionInfo, $cacheId, array(Enterprise_PageCache_Model_Processor::CACHE_TAG));     } } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 applyInApp, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0431\u043b\u043e\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0435. \u041a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 applyInApp, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 Enterprise_PageCache_Model_Container_Abstract:<\/p>\n<pre><code class=\"php\">\/**  * Generate and apply container content in controller after application is initialized  *  * @param string $content  * @return bool  *\/ public function applyInApp(&$content) {     $blockContent = $this-&gt;_renderBlock();     if ($blockContent === false) {         return false;     }       if (Mage::getStoreConfig(Enterprise_PageCache_Model_Processor::XML_PATH_CACHE_DEBUG)) {         $debugBlock = new Enterprise_PageCache_Block_Debug();         $debugBlock-&gt;setDynamicBlockContent($blockContent);         $debugBlock-&gt;setTags($this-&gt;_getPlaceHolderBlock()-&gt;getCacheTags());           $debugBlock-&gt;setType($this-&gt;_placeholder-&gt;getName());         $this-&gt;_applyToContent($content, $debugBlock-&gt;toHtml());     } else {         $this-&gt;_applyToContent($content, $blockContent);     }       $subprocessor = $this-&gt;_processor-&gt;getSubprocessor();     if ($subprocessor) {         $contentWithoutNestedBlocks = $subprocessor-&gt;replaceContentToPlaceholderReplacer($blockContent);         $this-&gt;saveCache($contentWithoutNestedBlocks);     }       return true; } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c _renderBlock \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u0441\u043e\u0431\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u0412 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 Enterprise_PageCache_Model_Container_Abstract \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 false. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c HTML-\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u043b\u043e\u043a\u0430.<\/p>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u0414\u043b\u044f \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u043d\u0435 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0434\u0430 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0438 \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c: $product = Mage::registry(&#8216;current_product&#8217;), \u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0451\u0442\u0435 \u0431\u043b\u043e\u043a\u043e\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: $this-&gt;getChild(&#8216;block_alias&#8217;)-&gt;setProduct($_product)).<\/p>\n<p>  \u041d\u043e, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, FPC \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 getCacheKeyInfo \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0451 \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f FPC-\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 _renderBlock \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u043d\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u043b\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u043c _getPlaceHolderBlock:<\/p>\n<pre><code class=\"php\">\/**  * Get Placeholder Block  *  * @return Mage_Core_Block_Abstract  *\/ protected function _getPlaceHolderBlock() {     if (null === $this-&gt;_placeholderBlock) {         $blockName = $this-&gt;_placeholder-&gt;getAttribute('block');         $this-&gt;_placeholderBlock = new $blockName;         $this-&gt;_placeholderBlock-&gt;setTemplate($this-&gt;_placeholder-&gt;getAttribute('template'));         $this-&gt;_placeholderBlock-&gt;setLayout(Mage::app()-&gt;getLayout());         $this-&gt;_placeholderBlock-&gt;setSkipRenderTag(true);     }     return $this-&gt;_placeholderBlock; } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c. \u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 _renderBlock:<\/p>\n<pre><code class=\"php\">\/**  * Render block content from placeholder  *  * @return string|false  *\/ protected function _renderBlock() {     \/**      * @var $block Turnkeye_Popup_Block_Popup      *\/     $block = $this-&gt;_getPlaceHolderBlock();     $placeholder = $this-&gt;_placeholder;       $serializedParameters = array('handles', 'popup_ids');     foreach ($serializedParameters as $parameter) {         $value = unserialize($placeholder-&gt;getAttribute($parameter));         $block-&gt;setDataUsingMethod($parameter, $value);     }       return $block-&gt;toHtml(); } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430, \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0431\u043b\u043e\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b handles \u0438 popup_ids. \u0412 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 \u0431\u043b\u043e\u043a\u0435 \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">public function getPopupIds() {     if (!$this-&gt;hasData('popup_ids')) {         $popupIds = ...         ...         $this-&gt;setData('popup_ids', $popupIds);     }       return $this-&gt;getData('popup_ids'); } <\/code><\/pre>\n<p>  \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0438\u043e\u0442\u043a\u0440\u044b\u043b\u0430 \u0437\u0430\u0432\u0435\u0441\u0443 \u0442\u0430\u0439\u043d\u044b \u043d\u0430\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c FPC, \u0438 \u0432\u044b \u0443\u0437\u043d\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c FPC \u0438\u0437\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>  \u041a\u0435\u0448 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0441\u043d\u0438\u0436\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u043c\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  \u0412 \u043c\u043e\u0435\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e FPC \u044f \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 Magento Enterprise \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c FPC. \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/214645\/\"> http:\/\/habrahabr.ru\/post\/214645\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/12d\/5b4\/b83\/12d5b4b83c0043cefab6d1505764acaa.png\" alt=\"Magento Enterprise - Full Page Cache\"\/><\/p>\n<h2>Magento Enterprise: \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Full Page Cache \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043d\u0443\u0436\u0435\u043d.<\/h2>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 Magento, \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 e-commerce \u0434\u0432\u0438\u0436\u043e\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043d \u043a \u0436\u0435\u043b\u0435\u0437\u0443. \u041d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u00ab\u0443\u0441\u043a\u043e\u0440\u044f\u043b\u043e\u043a\u00bb, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u043d\u0430 \u0434\u0432\u0438\u0436\u043a\u0435 Magento \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e Magento \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0421\u0440\u0435\u0434\u0438 \u0442\u0430\u043a\u0438\u0445 \u00ab\u0443\u0441\u043a\u043e\u0440\u044f\u043b\u043e\u043a\u00bb \u043a\u0435\u0448\u0438, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 JS\/CSS \u0432 \u043e\u0434\u0438\u043d \u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u0434\u0440.<\/p>\n<p>  \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u00ab\u0444\u0438\u0448\u0435\u043a\u00bb Magento Enterprise \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Full Page Cache (\u0434\u0430\u043b\u0435\u0435 FPC). \u042d\u0442\u0443 \u00ab\u0444\u0438\u0448\u043a\u0443\u00bb \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c Enterprise_PageCache, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043f\u0430\u043a\u0435\u0442\u0430 Magento Enterprise.<\/p>\n<p>  \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430\u044f \u0441\u0432\u0435\u0436\u0430\u044f \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f Magento Enterprise: 1.13.1.<\/p>\n<p>  FPC \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430 \u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0441\u0435\u0440\u0432\u0435\u0440. \u042f \u043f\u0440\u043e\u0432\u0435\u043b \u0437\u0430\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b), \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/d32\/cad\/23d\/d32cad23d249b8ce6f954ebbde271ded.png\" alt=\"Magento Enterprise - FPC\"\/><\/p>\n<ul>\n<li>65 ms \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c FPC (\u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0431\u044b\u043b\u0438 \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u044b);<\/li>\n<li>1250 ms \u043f\u0440\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c FPC (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u043a\u0435\u0448\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b);<\/li>\n<li>2500 ms \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u0435\u0448\u0435 \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u043b\u0438\u043a\u0430? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-214645","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/214645","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=214645"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/214645\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=214645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=214645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=214645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}