绕过我自己模块中的清漆缓存

时间:2016-05-30 16:25:57

标签: magento caching plugins varnish

我试图从服务器端使用清漆的magento网站上获取新内容。我的插件就像这样:

  • 当用户单击按钮时,它会调用构建会话ID的控制器
  • 从外面我获得此会话ID并召回用户的购物车。会话ID相应地更改为用户,但即使使用匿名浏览器会话打开用户链接,页面内容也保持不变。

有没有办法在我的插件中绕过清漆缓存控制而无需使用清漆?我无法访问服务器。

1 个答案:

答案 0 :(得分:0)

此类问题的一个常见做法是以get参数的形式实际使用缓存占用

由于Varnish实际上依赖于您用来访问网页的路线,因此Varnish会将一个不同的网址视为同一页面,并将其作为一个全新的页面进行缓存。

因此http://www.example.com/http://www.example.com/?cache_buster=1464645205完全相同,但Varnish会将这些视为两个不同的页面和两个不同的缓存条目。

请注意,我在那里使用的号码是一个时间戳,每次您想要访问任何页面的未缓存版本时都很容易生成。

至于Magento,由于URL是以http://www.example.com/module_front_nanme/controller_name/action_name/parameter_name_1/value_1/parameter_name_2/value_2的形式构建的,因此实际上你有“路由之类”获取参数。

如果您的目标是实际访问购物车,根据您在特定控制器中生成的会话ID,我要做的是将所述会话ID作为get参数重定向到购物车

/**
 * Please not this is an action that should be done in a controller
 */
public function someExampleAction() { 
    /**
      * I am generating a timestamp here as stated above, 
      * but it could be generated any other way, or you can keep
      * your session id "secret" if that is of any concern for your but
      * couple it with a simple cache buster from a timestamp as I did here
      */

    $sessionId = time();
    /**
      * This will redirect you to 
      * http://www.example.com/checkout/cart/index/cache_buster/1464645205
      */
    $this->_redirect( 'checkout/cart', array( 'cache_buster' => $sessionId ) );
}

如果您不在控制器中,那么您可以使用Mage::getUrl()完全相同的方式获取网址:

/** In any context */
$sessionId = time();
Mage::getUrl( 'checkout/cart', array( 'cache_buster' => $sessionId ) );