Magento 如果启用了全页缓存,则不会触发Enterprise Edition Controller事件

Magento 如果启用了全页缓存,则不会触发Enterprise Edition Controller事件,magento,Magento,因此,在我们最近的一次发布中,我们有很多事件是我们观察的,比如控制器动作。一旦网站上线,我们就开始注意到我们的观察者从未接到过这样的电话。经过一点调查,我们的一位开发人员在第292行的Mage_Core_Model_应用程序中发现了这段代码 if ($this->_cache->processRequest()) { $this->getResponse()->sendResponse(); } else {

因此,在我们最近的一次发布中,我们有很多事件是我们观察的,比如控制器动作。一旦网站上线,我们就开始注意到我们的观察者从未接到过这样的电话。经过一点调查,我们的一位开发人员在第292行的Mage_Core_Model_应用程序中发现了这段代码

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->\u cache->processRequest()是真的,那么当启用全页缓存时,您将永远无法访问调度。开发人员确实找到了http_response_send_,之前它以任何方式获取调用,但在我看来,这似乎是一个bug,或者如果启用了完整页面缓存,则永远不应该使用这些控制器调度事件。有什么想法吗?

鉴于整页缓存的性质,我将其称为“按预期工作”。虽然没有触发某些事件可能有点奇怪,但他们必须选择一条线路,这条线路对我来说很有意义,特别是因为控制器从未真正调度过


您应该将这些控制器调度事件用于任何影响页面的事件(因为它仍然需要生成),但如果您将其用于跟踪等,则不适用。

如果您想了解缓存如何与Magento Enterprise配合使用,请参阅此处


在启用和不启用全页缓存的情况下,唯一可靠的侦听事件是
之前的http\u response\u send\u
之前的controller\u front\u send\u response\u


无论FPC是否启用,都将触发此事件

我明白你的意思,显然,如果他们有缓存并且可以显示页面,那么就不会通过整个调度路径。我们在url中使用它作为参数。看来我们只会用另一个。你知道这对于购物车页面和结帐页面是否正确吗。我还有一个项目,我在做一些与控制器有关的事情,比如动作、预分配、结帐、购物车、索引,如果要找到一种不同的方式,那就太糟糕了。我正在从sessionIt的可测试性中删除一些内容,但我会继续猜测它也不会发送该事件。是的,我刚刚测试过,他们不会对购物车进行整页缓存,而且似乎不会。每次都是这样。很明显,您无法缓存购物车和签出,因为每个用户都会输入数据,而版本的更改取决于整个页面缓存仅针对“非会话访问者”。购物车中的物品意味着一个会话。我确实看到http_response_send_之前被调度,但如果你查看Mage_Core_Model_应用程序中的dispatchEvent方法,$this->_事件在命中整页缓存时实际上是空的,因此它根本不会运行整个调度内容