如何在symfony 1.4中缓存会话相关数据


How to cache session dependent data in symfony 1.4?

在阅读了symfony 1.4的缓存行为后,我发现symfony 1.4..没有考虑缓存模板的用户会话。。

现在的情况是,我有几个模板,它们的某些代码部分依赖于用户会话。。比方说,如果用户通过了身份验证,他就可以在产品列表中提问。。。现在我应该如何缓存这个模板文件。。。我知道的一件事是,为所有会话代码块创建单独的模板,并将cache设置为false。但如果你有。。。

谢谢,Hardik

警告:symfony缓存机制不支持私有缓存。应用不当会导致数据泄露

不要使用缓存。yml

对于以任何方式依赖于会话的内容,尤其是受会话限制的内容,都不要使用cache.yml。cache.yml无条件地向所有其他显示用户看到的第一个版本,无论是否登录。

使用条件缓存过滤器

相反,创建一个条件缓存筛选器。以下内容将缓存每个页面,并因此显示具有凭据myCredential的所有用户的第一个用户的版本。

// apps/myApp/lib/conditionalCacheFilter.php
class conditionalCacheFilter extends sfFilter() {
  public function execute($filterChain) {
    $context = $this->getContext();
    $user = $context->getUser();
    if ($user->isAuthenticated() && $user->hasCredential('myCredential')) {
      foreach ($this->getParameter('pages') as $page) {
        $context->getViewCacheManager()->addCache($page['module'], $page['action'], array('lifeTime' => 300));
      }
    }
    // Execute next filter
    $filterChain->execute();
  }
}

# filters.yml
conditionalCache:
  class: conditionalCacheFilter
  param:
    pages:
      - { module: myModule, action: myAction }
cache: ~

用例

这对于只向具有特定凭据的用户显示数据量大的页面非常有用,但所有用户都可以获得相同的页面。凭证特定统计信息页面的集合就是一个很好的例子。

替代用途

您也可以直接指定要添加到过滤器缓存中的页面。仍然只显式激活某些页面的筛选器可能是一个有用的故障保护。

// apps/backend/lib/conditionalCacheFilter.php
$context = $this->getContext();
$user = $context->getUser();
if ($user->isAuthenticated() && $user->hasPermission()) {
  $context->getViewCacheManager()->addCache('myModule', 'myAction', array(
    'withLayout' => true,
    'lifeTime'   => 3600,
  ));
}
#filters.yml
conditionalCache:
  class: conditionalCacheFilter
    pages:
      - { module: myModule, action: myAction }

没有真正的私有缓存

Symfony没有按用户提供专用缓存。您应该将客户端缓存控制标头与此用例的私有设置一起使用。您也可以使用nginx反向代理或类似的设置。

使用sf_cache_key参数。

http://www.symfony-project.org/gentle-introduction/1_4/en/12-Caching#chapter_12_sub_clearing_selective_parts_of_the_cache

您可以通过这种方式缓存模板

<?php $cache_str='something-that-is-uniq-'.$sf_user->isAuthenticated()?$sf_user->getGuardUser()->getId():'';
<?php if (!cache($cache_str,36000)): ?>
<div> something that you want to cache </div>
  <?php cache_save(); ?>
<?php endif; ?>

Hardik随着应用程序变得越来越复杂,在页面上拥有动态和缓存内容的最佳方式是使用具有自己缓存设置的分部和组件。您只需要将创建分部和组件的主要部分解耦,即可替换所有内容。然后将这些较小的部分添加到不应缓存的名称YourTemplateSuccess.php中,否则所有部分/组件都将被缓存。

更多关于缓存部分和组件的信息,请点击此处。

我用参数支持@dlondero的部分缓存,直到现在我还不知道。

在过去的一个项目中,我实现了一个修改后的缓存过滤器和管理器,它将根据基于会话的值在操作级别进行缓存。这可能(?)更有效,因为它缓存动作的整个结果(即,不仅仅是部分/组件)

https://github.com/yitznewton/freerms/blob/master/apps/resolver/lib/view/freermsResolverCacheManager.class.php

https://github.com/yitznewton/freerms/blob/master/apps/resolver/lib/filter/freermsResolverCacheFilter.class.php