อะไรจะเป็นวิธีที่ง่ายที่สุดในการสร้างรูเจาะ FPC สำหรับบล็อกแบบคงที่ (บล็อก cms)?
สมมติว่าฉันมีบล็อกแบบสแตติกที่เรียกบล็อกอื่นภายในที่มีพฤติกรรมที่ฉันต้องการเป็นแบบไดนามิกในทุก ๆ หน้าโหลด
อะไรจะเป็นวิธีที่ง่ายที่สุดในการสร้างรูเจาะ FPC สำหรับบล็อกแบบคงที่ (บล็อก cms)?
สมมติว่าฉันมีบล็อกแบบสแตติกที่เรียกบล็อกอื่นภายในที่มีพฤติกรรมที่ฉันต้องการเป็นแบบไดนามิกในทุก ๆ หน้าโหลด
คำตอบ:
วิธีที่ง่ายที่สุดที่ฉันค้นพบในการเจาะรูบล็อก CMS ในโมดูล Full Page Caching ของ Magento Enterprise มีเพียงไม่กี่ขั้นตอน:
ก่อนอื่นมาดูโครงสร้างไดเรกทอรีที่ต้องการ:
BranchLabs/CacheBuster/
Block/Cms.php # We inherit almost all functions from the Mage CMS
block, only overriding the "getCacheKeyInfo" function.
We do this to set the CMS block ID for later use by
our placeholder model.
etc/cache.xml # Here we target our module's version of the CMS block
and set their cache lifetimes to 0.
Model/Placeholder.php # This module is responsible for freshly rendering our
CMS blocks every time they're requested.
ด้วยความเข้าใจจากบนลงล่างนี่คือวิธีการกรอกไฟล์เหล่านั้น
สร้างคลาสบล็อกของคุณเองซึ่งขยายบล็อกใน Magento CMS คุณจะต้องแทนที่ฟังก์ชัน "getCacheKeyInfo" ดังนี้:
<?php
// BranchLabs/CacheBuster/Block/Cms.php
class BranchLabs_CacheBuster_Block_Cms extends Mage_Cms_Block_Block {
// Used to set the cache placeholder attribute definitions, required in
// the placeholder's "_renderBlock" function.
public function getCacheKeyInfo() {
return array('block_id' => $this->getBlockId());
}
}
ตั้งค่ารูปแบบตัวแทนที่รับผิดชอบในการแสดงบล็อก CMS ของเราโดยไม่ใช้แคช
<?php
// BranchLabs/CacheBuster/Model/Placeholder.php
class BranchLabs_CacheBuster_Model_Placeholder extends Enterprise_PageCache_Model_Container_Abstract {
public function applyWithoutApp(&$content)
{
return false;
}
protected function _getCacheId()
{
$id = 'CACHEBUSTER_HOLEPUNCH_' . microtime() . '_' . rand(0,99);
return $id;
}
/**
* CacheBuster doesn't cache data! Do nothing.
*/
protected function _saveCache($data, $id, $tags = array(), $lifetime = null)
{
return $this;
}
/**
* Render fresh block content.
*
* @return false|string
*/
protected function _renderBlock()
{
$block = $this->_placeholder->getAttribute('block');
$block = new $block;
// Get the block_id attribute we originally set in our CMS block's
// getCacheKeyInfo function.
$block_id = $this->_placeholder->getAttribute('block_id');
$block->setBlockId($block_id);
$block->setLayout(Mage::app()->getLayout());
return $block->toHtml();
}
}
ตั้งค่า cache.xml เพื่อกำหนดเป้าหมายบล็อก CMS ที่สร้างขึ้นใหม่และแสดงผลโดยใช้ตัวยึดตำแหน่งที่สร้างขึ้นใหม่ของเรา
<!-- BranchLabs/CacheBuster/etc/cache.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<config>
<placeholders>
<arbitrary_unique_identifier>
<block>cachebuster/cms</block>
<placeholder>ARBITRARY_UNIQUE_IDENTIFIER</placeholder>
<container>BranchLabs_CacheBuster_Model_Placeholder</container>
<cache_lifetime>0</cache_lifetime>
</arbitrary_unique_identifier>
</placeholders>
</config>
ใน CMS ให้แทนที่ประเภทบล็อกสำหรับบล็อกที่คุณพยายามแสดงนอกแคชด้วยบล็อกพิสูจน์ CMS ใหม่ของเรา: {{block type="cachebuster/cms" block_id="cacheproof"}}
ปัญหาคือทีมหลักของ Magento ลืมบล็อกแคชแบบสแตติกและสิ่งที่ไม่ได้ถูกแคชทีละรายการไม่สามารถเจาะรูได้
แน่นอนทางออกจะเปลี่ยนวิธีการทำแคช
FPC ของ Lesti กำลังทำสิ่งนี้ในที่ระลึกของฉันและฟรี มันขาดการสนับสนุนหลายเว็บไซต์เท่านั้น แต่มันสมบูรณ์แบบสำหรับ 1 เว็บไซต์และคุณจะสามารถระบุบล็อคที่ต้องเจาะรูแบบไดนามิก
ฉันยังลองใช้ FPC ของ Amasty คุณจะต้องจ่ายเงินและมันไม่ใช่โซลูชันแคชที่สมบูรณ์แบบสำหรับ CE ฉันเดา แต่มันใช้งานได้ดีคุณสามารถระบุการแคชบล็อก / หน้าหรือทั้งสองอย่าง คุณยังสามารถตั้งค่าอัตราการบีบอัดของวัตถุที่แคชและเก็บไว้ใน Db / ระบบแฟ้ม (ช้า) หรือ memcached
ขอให้คุณโชคดี.