Como posso impedir que uma página específica seja armazenada em cache?

14

Eu ativei o cache no meu site Drupal 8 e, é claro, todas as páginas são armazenadas em cache conforme o esperado.

No entanto, eu gostaria que uma página específica ignorasse esse cache.

No meu controlador, criei a página da seguinte maneira:

public function myPage() {
  return [
    '#markup' => time(),
  ];
}

Como posso dizer ao Drupal para não armazenar em cache minha página?

rpayanm
fonte

Respostas:

31

Para o Drupal 7:

O Drupal possui a função drupal_page_is_cacheable (), que pode ser usada para definir uma página como incachável.

Aqui está a documentação: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Para o Drupal 8:

// Deny any page caching on the current request.    
\Drupal::service('page_cache_kill_switch')->trigger();

Então o código é:

public function myPage() {
  \Drupal::service('page_cache_kill_switch')->trigger();
  return [
    '#markup' => time(),
  ];
}

Como de costume, limpe seu cache quando terminar.

Zuzuesque
fonte
19

Desativar cache para uma página específica

Desative o cache para uma página personalizada da declaração de rota. Se você deseja desativar o cache para um controlador personalizado (módulo Personalizado), você tem a no_cacheopção (YOUR_MODULE.routing.yml). Exemplo: Arquivo: 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'

Adicionada a opção de rota 'no_cache' para marcar as respostas de uma rota como inatingíveis

Vladislav
fonte
11

No Drupal 8, você pode mencionar o cache como a idade máxima até desejar que a produção da sua página seja armazenada em cache. Para remover o cache de uma página específica (página Controlador), escreva 'max-age' => 0,.

public function myPage() {
  return [
   '#markup' => time(),
   '#cache' => ['max-age' => 0,],    //Set cache for 0 seconds.
  ];
} 
Ashish Deynap
fonte
2

Se você precisar fazer algo com um módulo contrib, poderá usar um RouteSubscriber para corrigir o problema de cache. você precisa de um serviço ... ou apenas execute drupal grse tiver um console drupal.

 namespace Drupal\mymodule\Routing;

 use Drupal\Core\Routing\RouteSubscriberBase;
 use Symfony\Component\Routing\RouteCollection;

 class RouteSubscriber extends RouteSubscriberBase {

/**
 * {@inheritdoc}
 */
protected function alterRoutes(RouteCollection $collection) {
  // Find the route you need ...
  if ($route = $collection->get('some.contrib.route')) {
    $options = $route->getOptions();
    $options['no_cache'] = TRUE;
    $route->setOptions($options);
  }
 }
}

mais informações, consulte https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

Taggart Jensen
fonte
1

Você pode usar este módulo para evitar cache drupal e também cache do lado do servidor, como verniz https://www.drupal.org/project/ape

Funciona para mim no cache Varnish no servidor acquia.

VishnuMoorthy
fonte