특정 모듈에 대해 Twig 및 Block Cache를 비활성화하려면 어떻게합니까?


15

Drupal 8에서 외부 REST API에서 시간에 민감한 데이터를 검색하는 모듈을 작업 중입니다. 데이터가 처리되어 블록으로 전달됩니다. 최종 데이터는 다음과 같이 Twig 템플릿으로 전송됩니다.

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

캐시가 활성화되고 렌더링 된 데이터가 오래된 것으로 표시되는 프로덕션 환경에서는 작동하지 않습니다. 모듈에 대해서만 캐시를 비활성화하려면 Twig 템플릿과 Block 플러그인 모두에 대해 캐시를 비활성화해야합니까?

답변:


27

#cache 요소를 사용하여 렌더 배열에서 캐시를 제어 할 수 있습니다.

캐시를 비활성화하려면 다음을 추가하십시오.

$build['#cache']['max-age'] = 0;

이 경우 세션이있는 로그인 한 사용자 또는 익명 사용자에 대해 블록이 캐시되지 않습니다.

세션이없는 익명 사용자에 대한 캐시를 비활성화하려면 다음을 수행하십시오.

page_cache 모듈을 완전히 설치 제거하거나 kill 스위치를 트리거하여 사용 불가능하게하십시오 . 특정 페이지가 캐시되지 않도록 하려면 어떻게해야합니까?를 참조하십시오. 예를 들어.

나뭇 가지 코드의 캐싱은 이것에 연결되어 있지 않으며, 나뭇 가지 코드는 캐시를 지우고 처음으로 사용될 때 한 번만 캐시됩니다.

(Berdir의 의견에 따라 편집)


캐시 컨텍스트 가이 특정 경우에 도움이되지 않는다고 가정하지만 60과 같이 캐싱을 완전히 비활성화하는 0 대신 실제 최대 수명을 사용하고 싶을 것입니다. 데이터가 얼마나 민감한 지 확실하지 않지만 일반적으로 몇 분 또는 몇 분 동안 캐시됩니다. 또한 max-age는 익명 페이지 캐시에 영향을 미치지 않습니다. 익명 사용자에게 이것이 필요한 경우, 완전히 비활성화하거나 javascript를 사용하여 데이터를 가져와야합니다.
Berdir

@ Berdir : 익명 사용자에게는 max-age = 0을 사용하지만 세션에는 사용합니다. 이것은 현재 dev에서 작동합니다. 이것이 프로덕션에 괜찮다고 생각하십니까? 완전히 비활성화한다는 것은 무엇을 의미합니까?
4k4

세션이 있으면 괜찮습니다. 그러면 작동합니다. page_cache 모듈을 완전히 설치 제거하거나 kill 스위치를 트리거하여 사용 불가능하게하십시오 ( 예 : drupal.stackexchange.com/questions/151254/… 참조) .
Berdir

훌륭한 정보에 감사드립니다.이 답변에 이것을 추가했습니다.
4k4

1
$ build [ '# cache'] [ 'max-age'] = 0; 트릭을 했어 !!! 모든 맥주! :)
Sorin

6

특정 블록 캐싱을 중지하려면 다음 기능을 사용하십시오.

/**
 * Implements hook_preprocess_HOOK() for block.html.twig.
 */
function template-name_preprocess_block(&$vars) {
  if($vars['derivative_plugin_id'] == 'add-block-id-name') {
    //-- This stops the block being cache in drupal 8
    $vars['#cache']['max-age'] = 0;
  }
}

훌륭한 답변입니다.
눈동자

2

특정 페이지 / 컨텐트 유형 / 컨트롤러에 대한 캐시 비활성화

경로 선언에서 사용자 정의 페이지에 대한 캐시를 비활성화합니다.

사용자 정의 컨트롤러 (사용자 정의 모듈)에 대해 캐시를 사용하지 않으려면 no_cache(YOUR_MODULE.routing.yml) 옵션 이 있습니다. 예 : 파일 : mymodule.routing.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

경로의 응답을 캐시 할 수없는 것으로 표시하는 'no_cache'경로 옵션이 추가되었습니다.


0

특정 블록의 캐싱을 방지하려면

theme_name.theme 파일에 아래 코드를 추가 하십시오.

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}

0

블록 유형에 대한 캐시를 사용하지 않으려면 해당 유형의 블록을 사전 처리하고 max_age를 0으로 설정하십시오.

   /**
     * Implements hook_preprocess_HOOK() for Block document templates.
     */
    function THEMENAME_preprocess_block(array &$variables) {

      //disbale cache from spotlight
      $content = $variables['elements']['content'];
      //dump($content); //check the contents
      if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {

        if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
          $variables['#cache']['max-age'] = 0;
        }

      }


    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.