2012-01-28 79 views
4

在閱讀symfony 1.4的緩存行爲後,我才知道symfony 1.4不考慮緩存模板的用戶會話。如何在symfony 1.4中緩存會話相關數據?

現在,情況是,我有幾個模板,其中有一部分代碼取決於在用戶會話..讓我們說,如果用戶通過身份驗證,他有一個設施,問產品列表中的問題...現在我應該如何緩存此模板文件...我知道一件事,即爲所有會話代碼塊創建單獨的模板和將緩存設置爲false。但我想知道其他智能的方式,如果你有...

謝謝 Hardik

回答

3

警告:symfony緩存機制不支持私有緩存。錯誤地應用它會導致泄露的數據!

不要使用cache.yml

不要使用cache.yml在所有的依賴於以任何方式會話內容,特別是由會話限制的內容。 cache.yml 無條件顯示用戶已經看到的第一個版本,已登錄或未登錄。

使用條件緩存過濾

相反,建立一個conditional cache filter。對於所有擁有憑證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沒有一個由用戶私有緩存規定。你應該使用client side cache control headers with the private setting這個用例。您也可以使用nginx反向代理或類似的設置。

+0

感謝您的回答。 – hardik 2014-06-20 14:42:34

+1

@hadrik當然!因爲你永遠不會有足夠的基於堆棧溢出分數的狂妄自大,所以請隨時加入積分並接受加分。 – cmc 2014-06-20 16:54:41

0

Hardik爲您的應用程序變得越來越複雜,有一個頁面上的動態和緩存內容的最好方法是使用局部和組件用自己的緩存設置。您只需要將主要部分分開來創建部分和組件以替換所有內容。然後,將這些較小的部分添加到不應緩存的nameYourTemplateSuccess.php中,否則將緩存所有部分/組件。

有關高速緩存部分和組件的更多信息here

0

I second @ 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

+0

感謝您的回答 – hardik 2014-06-20 14:42:57

1

你可以緩存你的模板,這樣

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