2012-01-28 4 views
4

심포니 1.4의 캐싱 동작을 읽은 후 .. 난 symfony 1.4에서 세션 의존 데이터를 캐시하는 방법은 무엇입니까?

지금, 상황은, 내가 따라 코드의 일부가 여러 가지 템플릿이

1.4 캐싱 템플릿에 대한 사용자 세션을 고려하지 않는 것을 심포니를 .. 알게되었다 사용자 세션에서 .. 사용자가 인증을 받았다고 가정 해 봅시다. 제품 목록에 질문을 할 수있는 기능이 있습니다. 이제이 템플릿 파일을 캐시해야합니다 ... 한 세션 분의 코드 블록에 대해 별도의 템플릿을 만드는 것을 알고 있습니다. 캐시를 false로 설정합니다. 당신이있는 경우 그러나 나는 다른 스마트 방법을 알고 싶어 ...

는 Hardik

답변

3

경고 : 심포니 캐시 메커니즘은 개인 캐싱을 지원하지 않습니다. 잘못 누설 된 데이터가 적용됩니다!

전혀 어떤 방식으로 세션에 따라 내용, 세션에 의해 제한 특히 콘텐츠를 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 } 

진정한 개인 캐싱

심포니는 사용자 별 개인 캐시에 대한 규정이 없습니다. 이 경우에는 client side cache control headers with the private setting을 사용해야합니다. 당신은 또한 nginx 리버스 프록시 또는 이와 유사한 설정을 사용할 수 있습니다.

+0

답변 해 주셔서 감사합니다. – hardik

+1

@hadrik 물론! 스택 오버 플로우 스코어 기반의 오만함을 결코 가질 수 없으므로, upvote 및 자유로운 추가 포인트를 허용합니다. – cmc

0

Hardik를 응용 프로그램이 더 페이지에 동적 캐시 된 내용을 가지고하는 가장 좋은 방법은 더 복잡해진다으로 자신의 캐시 설정 부분과 구성 요소를 사용하는 것입니다. 모든 내용을 대체하기 위해 부분 및 구성 요소를 만드는 기본 섹션을 분리하면됩니다. 그런 다음이 작은 부분을 캐시되지 않아야하는 YourTemplateSuccess.php 이름에 추가합니다. 그렇지 않으면 모든 부분/구성 요소가 캐시됩니다.

부분 및 구성 요소 캐싱에 대한 추가 정보 here.

0

@ 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

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; ?> 
관련 문제