limpiar delete compilar cli cache caching magento

caching - delete - ¿Cómo incluyo un bloque dinámico en la página del producto con el caché de página completa activado?



magento 2 varnish cache (4)

Nos gustaría agregar un bloque dinámico a la página del producto. El problema es que la página del producto tiene caché de página completa (y no podemos desactivarlo debido a problemas de velocidad). Queremos mostrar información diferente en cada página de producto en función de la cuenta del usuario registrado, y varía de un producto a otro.

Creé un bloque separado que tiene su propio almacenamiento en caché, pero muestra el mismo bloque de la página anterior del producto. Estoy intentando modificar su método de almacenamiento en caché para que no guarde el caché de la página anterior del producto.

Funciona las primeras veces que voy a las páginas del producto, pero luego de repente comienza a mostrar una página de error de Magento que dice: "El sitio web encontró un error al recuperar http://www.mycompany.com/productpage.html . Puede ser abajo para mantenimiento o configurado incorrectamente ".

Esto es lo que hice hasta ahora. Creé la aplicación / code / local / MyCompany / MyModule / PageCache / etc / config.xml para agregar MyCompany_PageCache_Model.

Luego creé el archivo que controla el almacenamiento en caché en la aplicación / code / local / MyCompany / MyModule / PageCache / Model / Container / MyFile.php con estas funciones:

protected function _getCacheId() { return ''CONSTANT_CACHE'' . md5($this->_placeholder->getAttribute(''cache_id'')); } protected function _saveCache($data, $id, $tags = array(), $lifetime = null) { return false; } protected function _renderBlock() { $blockClass = $this->_placeholder->getAttribute(''block''); $template = $this->_placeholder->getAttribute(''template''); $block = new $blockClass; $block->setTemplate($template); $block->setLayout(Mage::app()->getLayout()); return $block->toHtml(); }

También creé cache.xml en Catalog / etc con mi marcador de posición para CONSTANT_CACHE.

¿Es incorrecta la sintaxis anterior, o hay una manera más fácil de hacer esto?


Visión de conjunto

Para responder, necesito explicar un poco primero. El proceso de FPC de Magento conoce cuatro estados.

  1. Página en caché, sin bloques dinámicos
  2. Página en caché, bloques dinámicos en caché
  3. Página en caché, bloques dinámicos no almacenados en caché
  4. Página no en caché

Los estados 1 y 2 se procesan sin que se inicialice la aplicación completa de Magento. Los estados 3 y 4 requieren que la aplicación se inicialice y el enrutamiento se procese. Por esa razón, trate de atender las solicitudes del estado 1 y 2 si es posible, de lo contrario perderá una gran parte de las posibles mejoras del FPC.

Estado 1

El estado 1 es aburrido desde el punto de vista de un desarrollador, no hay nada que hacer, así que pasemos a ...

Estado 2

En el estado 2, una página contiene bloques dinámicos. En este momento, Magento no se ha inicializado por completo .
El procesador FPC carga una página almacenada en caché y encuentra un marcador de posición para un bloque dinámico en ella.
Al analizar el marcador de posición, el procesador puede identificar la clase de contenedor para el bloque dinámico, lo instancia y llama a applyWithoutApp($content) en él. (El nombre del método se refiere al hecho de que la aplicación Magento no se ha inicializado hasta el momento). A continuación, el contenedor intenta cargar el contenido del bloque dinámico desde la memoria caché del bloque, utilizando la clave de caché devuelta por el método $this->_getCacheId() .
Si se devuelve una clave de caché y se puede cargar una entrada de caché, la clase de contenedor reemplaza el marcador de posición en $content con la salida de bloque en caché y se completa el FPC.
Hasta el momento, no se han producido demasiados gastos generales.

Estado 3

Así que applyWithoutApp($content) en el estado 2 no pudo obtener y entregar el contenido del bloque dinámico, por lo que el contenido del bloque debe generarse, aunque el resto de la página se haya encontrado en el FPC.
Para este fin, el módulo FPC establece la solicitud de pagecache/request/process de pagecache/request/process , y se sigue la inicialización y el enrutamiento de la aplicación Magento.
Esto significa que se produce mucho más sobrecarga con el estado 2, aunque todavía es un poco mejor que una carga de página normal sin el FPC, porque, por ejemplo, se omite la reescritura de URL.
Finalmente, el controlador frontal y el enrutador estándar delegan la solicitud al método RequestController::processAction() .
El método recupera la clase de contenedor instanciada previamente para el bloque dinámico y llama a applyInApp($content) en él.
Este método ejecuta $this->_renderBlock() para crear una instancia de la clase de bloque real y devolver su salida. Usted ya implementó este método de acuerdo con su pregunta. El FPC ahora puede reemplazar el marcador de posición con el contenido del bloque y entregar la página.
Una cosa a tener en cuenta es que esta no es una solicitud de página de detalles de productos regulares, por lo que, por ejemplo, Mage::registry(''current_product'') no está disponible. Dependiendo de la implementación de su bloque, esto puede influir en el almacenamiento en caché de nivel de bloque o la generación de contenido del bloque dinámico. Sospecho que es aquí de donde proviene su problema, pero llegaré a una posible solución un poco más abajo.

Estado 4

En este estado, el FPC no encontró un registro de caché para la página solicitada, por lo que Magento genera la página como de costumbre, por ejemplo, la salida de la página de detalles del producto es creada por Mage_Catalog_ProductController::viewAction() .
Todos los bloques que están configurados para ser dinámicos, de acuerdo con el cache.xml , están envueltos en etiquetas de marcador de posición.
Las etiquetas de marcador de posición contienen argumentos, que luego se pasan al objeto contenedor para los pasos 2 y 3. Los únicos argumentos que siempre se establecen son el contenedor y los nombres de clase de bloque. Pero casi siempre se establecen un cache_id y una template también.
En la clase contenedor, se puede acceder a estos valores utilizando $this->_placeholder->getAttribute(''cache_id'') (como lo hizo en el método _getCacheId () de su contenedor).

Incluso si pasó por alto la mayor parte de esta larga respuesta, aquí es donde podría ser interesante para usted. Si necesita valores adicionales para generar el Id. De la memoria caché de bloques o la salida del bloque, (por ej., La Id del producto o la Id. Del cliente), puede establecerlos como argumentos en el marcador de posición .

Para hacerlo, debe configurarlos en la matriz devuelta por el método getCacheKeyInfo() bloque con una cadena como una clave de matriz . Si usa un índice de matriz numérica, no se establecerán como argumentos en el marcador de posición.

public function getCacheKeyInfo() { $info = parent::getCacheKeyInfo(); $info[''current_product_id''] = Mage::registry(''current_product'')->getId(); $info[''customer_id''] = Mage::getSingleton(''customer/session'')->getCustomerId(); return $info; }

Ahora se puede acceder a estos valores en la clase contenedor utilizando $this->_placeholder->getAttribute(''current_product_id'') .

Conclusión

Probablemente no desee anular _saveCache() en su clase de contenedor para devolver false . En su lugar, incluya la identificación del cliente y la identificación del producto en la cadena devuelta por _getCacheId() . De esta forma, cada cliente obtiene su propia entrada de caché. Algunos gastos generales se reducirán porque applyWithoutApp() puede guardar y cargar el bloque dinámico desde el caché (si el mismo cliente ve una página dos veces).

En _renderBlock() establece los valores adicionales que necesita para que el bloque pueda generar sus contenidos, por ejemplo

$block->setProductId($this->_placeholder->getAttribute(''current_product_id''));

En el lado del bloque, la identificación del producto y la identificación del cliente en la matriz de información de la caché garantizarán que cada cliente obtenga el resultado correcto para la página solicitada, incluso cuando el bloque esté en la memoria caché.

No puedo estar seguro (no has proporcionado el código de bloque), pero sospecho que el ID de caché que estás utilizando no contiene todos los argumentos que necesita para asignar de manera única el registro de caché para el bloque al producto correcto .

Usando los pasos y sabiendo cómo pasar argumentos a un contenedor de bloque dinámico, es posible retener la mayor parte de la ganancia de rendimiento de FPC, incluso cuando se crean bloques dinámicos personalizados. Espero que esta información sea suficiente para que pueda rastrear el problema que está describiendo y solucionarlo.


En general, hay dos enfoques que puede usar si desea personalizar una página que está destinada a almacenarse en un caché de página completa.

  1. Si su proxy inverso lo admite, puede usar ESI (Edge Side Includes) y marcar correctamente su plantilla. ESI le permite insertar un marcador en su HTML generado donde debe ir el contenido personalizado, luego su proxy solicitará solo el contenido personalizado de la ruta de controlador apropiada del servidor de aplicaciones cuando sea necesario. Si está utilizando Varnish , ESI está disponible para su uso. La extensión Lightspeed para Magento tiene una función llamada " Hole Punching" que hace algo similar.
  2. Si ESI o Hole Punching no están disponibles para usted, entonces la otra opción es permitir que la página principal se guarde en caché en su caché de página completa, y use un poco de javascript para hacer una solicitud Ajax por separado y obtener la información que necesita.

No hay necesidad de:

$info[''current_product_id''] = Mage::registry(''current_product'')->getId();

Puedes usar este método:

$this->_getProductId()

implementado en Enterprise_PageCache_Model_Container_Abstract


Realmente aprecio la respuesta de Vinai. Además, sugiero una extensión de FPC de Gordon Lesti que admite la perforación de agujeros. Puedes conseguirlo aquí

Para obtener instrucciones sobre cómo funciona la perforación de huecos con esta extensión, le sugiero que visite esta página

Espero que ayude a alguien que no esté tan familiarizado con los conceptos.