ฉันมีเว็บไซต์ที่มีบล็อกคงที่หลายอันซึ่งทำงานใน 1.9.1.0 แต่ด้วย 1.9.2.0 บล็อกคงเริ่มแสดงเป็นระยะเนื่องจากบางครั้งพวกเขาแสดงบล็อกผิดมากกว่าบล็อกที่ถูกต้อง บางครั้งพวกเขาแสดงตามที่ต้องการ ไม่มีใครรู้วิธีแก้ปัญหานี้ซึ่งอาจเกี่ยวข้องกับปัญหานี้หรือไม่
ฉันมีเว็บไซต์ที่มีบล็อกคงที่หลายอันซึ่งทำงานใน 1.9.1.0 แต่ด้วย 1.9.2.0 บล็อกคงเริ่มแสดงเป็นระยะเนื่องจากบางครั้งพวกเขาแสดงบล็อกผิดมากกว่าบล็อกที่ถูกต้อง บางครั้งพวกเขาแสดงตามที่ต้องการ ไม่มีใครรู้วิธีแก้ปัญหานี้ซึ่งอาจเกี่ยวข้องกับปัญหานี้หรือไม่
คำตอบ:
ฉันมีปัญหากับ EE 1.14.2 นี้และดูเหมือนว่าปัญหาเดียวกันได้เกิดขึ้นใน CE 1.9.2 ฉันบันทึกปัญหาและแนวทางแก้ไขสำหรับคำถาม SEนี้
โดยทั่วไปเนื่องจากรหัสต่อไปนี้จะถูกเพิ่มลงในตัวสร้างของMage_Cms_Block_Block
:
$this->setCacheTags(array(Mage_Cms_Model_Block::CACHE_TAG));
$this->setCacheLifetime(false);
บล็อกคง CMS ตอนนี้ถูกแคช ปัญหาเกิดขึ้นจากวิธีสร้างข้อมูลคีย์แคช มันกลับไปMage_Core_Block_Abstract
ทำงานของการใช้ชื่อบล็อกในรูปแบบ หากยังไม่ได้เพิ่มบล็อกด้วยเลย์เอาต์เช่นในหน้า cms ชื่อนี้จะไม่มีอยู่ สิ่งนี้อาจส่งผลให้บล็อกแบบคงที่แบ่งปันคีย์แคชเดียวกันและนำมาผสมกันในแคช
โซลูชันของฉันคือแทนที่Mage_Cms_Block_Block
คลาสและตั้งค่าข้อมูลคีย์แคชตามรหัสบล็อกและที่จัดเก็บปัจจุบัน
/**
* Override cms/block to add cache key. This started being a problem as of EE 1.14.2 and CE 1.9.2 when the _construct
* method was added which turns on caching for cms blocks
*/
class Mysite_Cms_Block_Block extends Mage_Cms_Block_Block
{
/**
* If this block has a block id, use that as the cache key.
*
* @return array
*/
public function getCacheKeyInfo()
{
if ($this->getBlockId()) {
return array(
Mage_Cms_Model_Block::CACHE_TAG,
Mage::app()->getStore()->getId(),
$this->getBlockId(),
(int) Mage::app()->getStore()->isCurrentlySecure()
);
} else {
return parent::getCacheKeyInfo();
}
}
}
แน่นอนว่าสิ่งนี้จะต้องเพิ่มในโมดูลของคุณเองด้วยconfig.xml
ไฟล์และการแทนที่บล็อกเป็นต้นหรือคุณสามารถคัดลอกMage_Cms_Block_Block
ไปยังพูลโค้ดโลคัลและเพิ่มแคชคีย์ที่นั่น
คุณสามารถดูบรรทัดใหม่ที่เพิ่มใน 1.9.2 ที่นี่
ฉันเพิ่งอัพเกรดเป็น 1.9.2.0 และฉันก็พบสิ่งนี้เช่นกัน หมวดหมู่ที่ตั้งค่าให้แสดงบล็อกแบบคงที่ + ผลิตภัณฑ์สุ่มแสดงบล็อกแบบคงที่ผิด สิ่งนี้ไม่มีอยู่ก่อนการอัพเกรด 1.9.2.0 ของฉัน
แก้ไขชั่วคราวปิดใช้งานแคชแคชเอาต์พุต HTML และบล็อกที่แสดงนั้นถูกต้อง
ที่นี่เราจะไปกับการแก้ปัญหาตามโมดูลท้องถิ่นโซลูชั่นดังกล่าวไม่ได้ให้ขั้นตอนทั้งหมด เราจำเป็นต้องสร้างโมดูลแบบกำหนดเองเพราะคุณทุกคนรู้ว่า Magento Boogieman จะให้คุณได้รับ! ถ้าเปลี่ยนแกน :)
คุณจะต้องมีไฟล์ดังต่อไปนี้: app/etc/modules/Bhupendra_Cms.xml
<?xml version="1.0"?>
<config>
<modules>
<Bhupendra_Cms>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Cms/>
</depends>
</Bhupendra_Cms>
</modules>
</config>
app/code/local/Bhupendra/Cms/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Bhupendra_Cms>
<version>1.0.0</version>
</Bhupendra_Cms>
</modules>
<global>
<blocks>
<cms>
<rewrite>
<block>Bhupendra_Cms_Block_Block</block>
<widget_block>Bhupendra_Cms_Block_Widget_Block</widget_block>
</rewrite>
</cms>
</blocks>
</global>
</config>
app/code/local/Bhupendra/Cms/Block/Block.php
<?php
class Bhupendra_Cms_Block_Block extends Mage_Cms_Block_Block {
public function getCacheKeyInfo()
{
$blockId = $this->getBlockId();
if ($blockId) {
$result = array(
$blockId,
Mage::app()->getStore()->getCode(),
);
} else {
$result = parent::getCacheKeyInfo();
}
return $result;
}
}
app/code/local/Bhupendra/Cms/Block/Widget/Block.php
class Bhupendra_Cms_Block_Widget_Block extends Mage_Cms_Block_Widget_Block
{
/**
* Storage for used widgets
*
* @var array
*/
static protected $_widgetUsageMap = array();
/**
* Prepare block text and determine whether block output enabled or not
* Prevent blocks recursion if needed
*
* @return Mage_Cms_Block_Widget_Block
*/
protected function _beforeToHtml()
{
parent::_beforeToHtml();
$blockId = $this->getData('block_id');
$blockHash = get_class($this) . $blockId;
if (isset(self::$_widgetUsageMap[$blockHash])) {
return $this;
}
self::$_widgetUsageMap[$blockHash] = true;
if ($blockId) {
$block = Mage::getModel('cms/block')
->setStoreId(Mage::app()->getStore()->getId())
->load($blockId);
if ($block->getIsActive()) {
/* @var $helper Mage_Cms_Helper_Data */
$helper = Mage::helper('cms');
$processor = $helper->getBlockTemplateProcessor();
$this->setText($processor->filter($block->getContent()));
$this->addModelTags($block);
}
}
unset(self::$_widgetUsageMap[$blockHash]);
return $this;
}
/**
* Retrieve values of properties that unambiguously identify unique content
*
* @return array
*/
public function getCacheKeyInfo()
{
$result = parent::getCacheKeyInfo();
$blockId = $this->getBlockId();
if ($blockId) {
$result[] = $blockId;
}
return $result;
}
}
สำหรับข้อมูลเพิ่มเติมคุณสามารถเยี่ยมชมลิงค์ต่อไปนี้และดาวน์โหลดได้จาก ลิงค์https://www.milople.com/blogs/ecommerce/solved-magento-static-block-display-issue.html
ไม่มีแพทช์อย่างเป็นทางการสำหรับเรื่องนี้อย่างไรก็ตามมันได้รับการแก้ไขใน CE 1.9.2.1
diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Block.php
74a75,94
>
> /**
> * Retrieve values of properties that unambiguously identify unique content
> *
> * @return array
> */
> public function getCacheKeyInfo()
> {
> $blockId = $this->getBlockId();
> if ($blockId) {
> $result = array(
> 'CMS_BLOCK',
> $blockId,
> Mage::app()->getStore()->getCode(),
> );
> } else {
> $result = parent::getCacheKeyInfo();
> }
> return $result;
> }
diff -r magento-CE-1.9.2.0/app/code/core/Mage/Cms/Block/Widget/Block.php magento-CE-1.9.2.1/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
> $this->addModelTags($block);
90a92,106
>
> /**
> * Retrieve values of properties that unambiguously identify unique content
> *
> * @return array
> */
> public function getCacheKeyInfo()
> {
> $result = parent::getCacheKeyInfo();
> $blockId = $this->getBlockId();
> if ($blockId) {
> $result[] = $blockId;
> }
> return $result;
> }
หมายเหตุ: มีรายงานว่ายังคงมีปัญหากับหน้า CMS ในหลายมุมมองร้านค้า:
Magento CE 1.9.2.1 แก้ไขได้เพียงบางส่วนเท่านั้น
ปัญหายังคงมีอยู่สำหรับหน้า CMS ในหลายมุมมองร้านค้า นี่คือโปรแกรมแก้ไขด่วนที่อัปเดต (โปรดทราบว่านี่ไม่ใช่โปรแกรมปรับปรุงอย่างเป็นทางการ): https://gist.github.com/tux-rampage/77b286f7973336877f7b#file-luka-mce20150805-1-9-2-1-caching-hotfix-patch
ที่มา: http://www.magentocommerce.com/products/bug-tracking/issue/index/id/870
ฉันสามารถยืนยันปัญหานี้ได้เช่นกัน
ในการทำซ้ำ:
ใช้CMS -> Widgets
, สร้างวิดเจ็ตเพื่อเพิ่มบล็อกแบบคงที่ไปที่แถบข้างด้านซ้าย
จากนั้นสร้างวิดเจ็ตที่สองเพื่อเพิ่มบล็อกสแตติกที่สอง (บล็อกที่แตกต่างจากในstep 1
) ไปที่แถบด้านข้างซ้าย
หากปิดใช้งานแคชบล็อกแบบคงที่ทั้งสองจะแสดงอย่างถูกต้องในแถบด้านข้าง
แต่ถ้าคุณเปิดใช้งานแคชคุณจะเห็นบล็อกแบบคงที่step 1
ปรากฏขึ้นสองครั้ง
Piotr จาก Magento ได้เผยแพร่ชุดข้อมูลแก้ไขที่ไม่ใช่เป็นทางการสำหรับปัญหานี้ในขณะนี้: https://gist.github.com/piotrekkaminski/ecd245e8c9390e4020db
ดูเหมือนว่าจะทำเคล็ดลับ ใช่มันกำลังแก้ไขหลัก แต่แก้ไขปัญหาได้จนกว่า Magento จะปล่อยแพทช์อย่างเป็นทางการหรือเวอร์ชั่นถัดไป ...
อัพเกรด Magento เป็น 1.9.2.1
ฉันทำและเปิดใช้งานแคชสำหรับบล็อก HTML และดูเหมือนว่าจะได้รับการแก้ไข
รวมถึงปัญหาด้านความปลอดภัยบางอย่างได้รับการแก้ไขในรุ่นใหม่
ในเวอร์ชั่นล่าสุดของ Magento ปรับปรุงด้วยคุณสมบัติความปลอดภัยใหม่ คุณสามารถเพิ่มสิทธิ์ในระบบ -> สิทธิ์ในบล็อกแบบคงที่
ฉันมีปัญหาเดียวกันกับร้านค้าของฉัน วิธีแก้ปัญหาที่ดีที่สุดที่ฉันพบคือการปิดใช้งานการแคชสำหรับบล็อกที่ได้รับผลกระทบ คุณสามารถทำได้โดยการตั้งค่าอายุการใช้งานแคชของบล็อกเป็นโมฆะ
การปิดใช้งานแคช "บล็อก HTML เอาต์พุต" ทั่วโลกในไซต์สดไม่ใช่ความคิดที่ดีเพราะจะส่งผลต่อประสิทธิภาพของไซต์โดยไม่จำเป็น
การปิดใช้งานแคชหนึ่งบล็อกใน xml:
<block ... >
...
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
</block>
ปิดการใช้งานแคชสำหรับหนึ่งบล็อกใน php:
$this->getLayout()->createBlock('cms/block')
->setCacheLifetime(null)
->setBlockId('block-id')
->toHtml();
อย่าตั้งค่าอายุการใช้งานแคชเป็น "0" ตามที่อธิบายไว้ในบทความนี้
$block->setCacheLifeTime("null");
หมายเหตุNULL
และ "โมฆะ" เป็นสองสิ่งที่แตกต่างกัน
ฉันสามารถแก้ไขปัญหานี้ได้โดยอัปเดตส่วนขยายที่มีอยู่ใน Magento Connection Manager หลังจากตรวจดูแล้วฉันรู้สึกว่าปัญหานั้นมีอยู่ในระบบแคชของวีโอไอพี
โดยปกติแล้ววีโอไอพีจะมีแพ็คเกจต่าง ๆ ที่เกี่ยวข้องกับเทคโนโลยีแคช ประกอบด้วยอแด็ปเตอร์และไลบรารีสำหรับ Zend และ Redis
แทนที่จะพยายามค้นหาแพ็คเกจที่เหมาะสมฉันเลือกอัปเดตแพ็คเกจทั้งหมดในการติดตั้ง
จากนั้นฉันเลือกเครื่องหมายถูกที่: Mage_All_Latest ซึ่งเป็น Metapackage สำหรับ Magento 1.9.0.0 ที่เสถียรล่าสุด
อาจเป็นไปได้ที่จะแก้ไขปัญหาโดยการอัพเกรดเฉพาะแพ็คเกจที่เหมาะสม ฉันรู้สึกว่านี่เป็นวิธีที่ดีกว่าที่จะไปเพราะฉันสงสัยว่าวิธีนี้ใช้แพทช์รักษาความปลอดภัยด้วย
คุณจะต้องทำการอัพเกรดแบบเต็มหรือ backport 1.9.2.0
CMS Block และ Widget การเปลี่ยนแปลงการแคชใน 1.9.2.1
วีโอไอพี-1921 / app / รหัส / core / Mage / ซม / บล็อก / Block.php
diff -r magento-1920/app/code/core/Mage/Cms/Block/Block.php magento-1921/app/code/core/Mage/Cms/Block/Block.php
74a75,94
>
> /**
> * Retrieve values of properties that unambiguously identify unique content
> *
> * @return array
> */
> public function getCacheKeyInfo()
> {
> $blockId = $this->getBlockId();
> if ($blockId) {
> $result = array(
> 'CMS_BLOCK',
> $blockId,
> Mage::app()->getStore()->getCode(),
> );
> } else {
> $result = parent::getCacheKeyInfo();
> }
> return $result;
> }
วีโอไอพี-1921 / app / รหัส / core / Mage / ซม / บล็อก / เครื่องมือ / Block.php
diff -r magento-1920/app/code/core/Mage/Cms/Block/Widget/Block.php magento-1921/app/code/core/Mage/Cms/Block/Widget/Block.php
84a85
> $this->addModelTags($block);
89a91,105
> }
>
> /**
> * Retrieve values of properties that unambiguously identify unique content
> *
> * @return array
> */
> public function getCacheKeyInfo()
> {
> $result = parent::getCacheKeyInfo();
> $blockId = $this->getBlockId();
> if ($blockId) {
> $result[] = $blockId;
> }
> return $result;
ฉันใช้ Magento 1.9.3.8 และปัญหายังคงมีอยู่
คุณสามารถค้นหาการแก้ไขของฉันได้ที่นี่ :
โดยทั่วไปฉันจะเพิ่มสตริงที่ไม่ซ้ำกันตาม url หน้าและ blockId ไปยังข้อมูลคีย์แคชแต่ละรายการดังนั้นแต่ละบล็อกจะมีคีย์ที่ไม่ซ้ำกัน:
/**
* Generates a string based on the page url (for example category/product pages) and concatenate the block id to the url
* Removes the caracters: /, . , &, = and , from this string
*/
private function generateUrlBasedString($blockId = null)
{
$currentUrl = Mage::helper('core/url')->getCurrentUrl();
$url = Mage::getSingleton('core/url')->parseUrl($currentUrl);
$path = '_' . $url->getPath();
$path = str_replace('/', '', $path);
$path = str_replace('.', '', $path);
$path = str_replace('&', '', $path);
$path = str_replace(',', '', $path);
$path = str_replace('=', '', $path);
if(isset($blockId)) {
$path .= '_' . $blockId;
}
return $path;
}
/**
* Retrieve values of properties that unambiguously identify unique content
*
* @return array
*/
public function getCacheKeyInfo()
{
$blockId = $this->getBlockId();
if ($blockId) {
$result = array(
'CMS_BLOCK',
$blockId,
Mage::app()->getStore()->getCode() . $this->generateUrlBasedString($blockId),
);
} else {
$result = parent::getCacheKeyInfo();
}
return $result;
}
จนกระทั่ง Magento เตรียมการแก้ไขสำหรับปัญหานี้คุณสามารถสร้างไฟล์:
app / รหัส / ท้องถิ่น / Mage / ซม / บล็อก / Block.php
และใส่รหัสจาก URL GitHub ด้านบนเป็นเนื้อหา
รหัสนี้ได้รับการทดสอบสำหรับ Magento 1.9.2. * และ 1.9.3. *
นี่เป็นข้อผิดพลาดที่ได้รับการยืนยันในเวอร์ชั่น 1.9.2 ในขณะนี้คุณสามารถแก้ไขปัญหานี้ได้โดยเพียงแค่ปิดการใช้งานแคช "บล็อก HTML เอาต์พุต" จากผู้ดูแลระบบ -> ส่วนการจัดการแคช
หวังว่ามันจะช่วย