【发布时间】:2011-12-06 18:55:25
【问题描述】:
如何禁用或绕过单个页面的 FPC?我不想使用打孔,因为页面上有几个块我需要是动态的,我宁愿修改一个配置/类来指定不应该缓存整个页面(类似于结帐的行为)。
我对 FPC 的理解是它不用于“会话用户”(登录、添加到购物车等)。但是,当用户登录时,我发现 FPC 会影响页面。如果我禁用 FPC,则页面会按预期工作。
【问题讨论】:
如何禁用或绕过单个页面的 FPC?我不想使用打孔,因为页面上有几个块我需要是动态的,我宁愿修改一个配置/类来指定不应该缓存整个页面(类似于结帐的行为)。
我对 FPC 的理解是它不用于“会话用户”(登录、添加到购物车等)。但是,当用户登录时,我发现 FPC 会影响页面。如果我禁用 FPC,则页面会按预期工作。
【问题讨论】:
这是为特定控制器禁用 FPC 的解决方案(也可以扩展到特定操作)。
首先创建一个观察者来监听controller_action_predispatch事件:
public function processPreDispatch(Varien_Event_Observer $observer)
{
$action = $observer->getEvent()->getControllerAction();
// Check to see if $action is a Product controller
if ($action instanceof Mage_Catalog_ProductController) {
$cache = Mage::app()->getCacheInstance();
// Tell Magento to 'ban' the use of FPC for this request
$cache->banUse('full_page');
}
}
然后将以下内容添加到模块的 config.xml 文件中。这在<frontend> 部分:
<events>
<controller_action_predispatch>
<observers>
<YOUR_UNIQUE_IDENTIFIER>
<class>YOURMODULE/observer</class>
<method>processPreDispatch</method>
</YOUR_UNIQUE_IDENTIFIER>
</observers>
</controller_action_predispatch>
</events>
现在 Magento 每次都会为您的页面提供服务,并绕过 FPC 处理请求。
【讨论】:
Mage_PageCache_Model_Processor,但它不能被覆盖,因为它是用new .. 初始化的(至少在开始时......第二次使用sigleton......)
刚刚完成与 Magento EE FPC 的角力,不在缓存的 CMS 页面上显示核心消息。核心消息在缓存类别和产品页面上运行良好,但在 CMS 页面上运行良好。我发现通过将某个参数传递给页面,您可以强制生成该页面,而不是从缓存中生成服务器。
发现于:app/code/core/Enterprise/PageCache/Model/Processor/Default.php
/**
* Disable cache for url with next GET params
*
* @var array
*/
protected $_noCacheGetParams = array('___store', '___from_store');
因此,可以创建一个包含绕过 FPC 的 HTTP GET 查询字符串的链接。
http://www.domain.com/?___store
这有助于解决我遇到的问题,即插件重定向到带有会话消息的引荐网址,但如果引荐来源是 CMS 页面,则在查看非 CMS 页面之前不会显示消息。
【讨论】:
Magento 的 FPC 是一种复杂的野兽。
我已经使用以下教程克服了这个问题:
http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/
这可能就是您所说的“打孔”,但这是我发现的唯一克服它的方法。
【讨论】: