因此,在我们最近的一次发布中,我们收到了很多我们观察过的事件,例如controller_action_predispatch。一旦网站上线,我们就开始注意到我们的观察者从未被人们召集过。经过一番调查后,我们的一位开发人员在第292行的Mage_Core_Model_App中找到了这段代码
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
$this->_initModules();
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
}
$this->getFrontController()->dispatch();
}
正如您所看到的那样,$ this-> _cache-> processRequest()是真的,当启用整页缓存时,您永远不会进入调度。开发人员确实找到了http_response_send_before,它可以通过任何方式进行调用,但在我看来,这是一个错误,或者如果您启用了完整页面缓存,则不应该使用这些控制器调度事件。有什么想法吗?
答案 0 :(得分:7)
鉴于整页缓存的性质,我称之为“按预期工作”。虽然没有一些事件发射可能有点奇怪,但是他们不得不选择一条线,这对我来说很有意义,特别是因为控制器从未真正发送过。
您应该将这些控制器调度事件用于影响页面的任何事情(因为它仍然需要生成),但是如果您使用它进行跟踪等等,那么它就不适合。
答案 1 :(得分:4)
如果您想了解Caching如何与Magento Enterprise配合使用,请参阅此处
http://magentophp.blogspot.com/2011/02/magento-enterprise-full-page-caching.html
答案 2 :(得分:1)
在启用和不启用整页缓存的情况下,唯一可靠的监听的事件是http_response_send_before
。
答案 3 :(得分:0)
controller_front_send_response_before
无论启用了FPC,都会触发此事件