Php 如何在symfony 1.4中缓存依赖于会话的数据?

Php 如何在symfony 1.4中缓存依赖于会话的数据?,php,caching,symfony1,symfony-1.4,Php,Caching,Symfony1,Symfony 1.4,读取symfony 1.4的缓存行为后。。我知道symfony 1.4没有考虑缓存模板的用户会话 现在,情况是,我有几个模板,其中的一些代码部分取决于用户会话。。假设用户通过了身份验证,他可以在产品列表中提问。。。现在我应该如何缓存此模板文件。。。我知道的一件事是,为所有会话代码块创建单独的模板,并将cache设置为false。但我想知道其他聪明的方法如果你有 谢谢,, Hardik使用sf_缓存_键param Hardik随着应用程序变得越来越复杂,在页面上拥有动态和缓存内容的最佳方法是使用具

读取symfony 1.4的缓存行为后。。我知道symfony 1.4没有考虑缓存模板的用户会话

现在,情况是,我有几个模板,其中的一些代码部分取决于用户会话。。假设用户通过了身份验证,他可以在产品列表中提问。。。现在我应该如何缓存此模板文件。。。我知道的一件事是,为所有会话代码块创建单独的模板,并将cache设置为false。但我想知道其他聪明的方法如果你有

谢谢,,
Hardik

使用
sf_缓存_键
param


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


更多关于缓存部分和组件的信息。

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

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


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

<?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; ?>

你想要缓存的东西
警告:symfony缓存机制不支持私有缓存。如果应用不当,将导致数据泄漏

不要使用cache.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反向代理或类似设置。

谢谢您的回答。@hadrik当然可以!因为你永远不会有足够的基于堆栈溢出分数的傲慢,所以请随意投票并接受给我额外分数。谢谢你的回答