¿Cómo puedo evitar que una página en particular se almacene en caché?

14

He activado el caché en mi sitio Drupal 8 y, por supuesto, todas las páginas se almacenan en caché como se esperaba.

Sin embargo, me gustaría que una página específica omita ese caché.

En mi controlador construí la página de la siguiente manera:

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

¿Cómo puedo decirle a Drupal que no almacene en caché mi página?

rpayanm
fuente

Respuestas:

31

Para Drupal 7:

Drupal tiene la función drupal_page_is_cacheable () que se puede usar para configurar una página como no almacenable en caché.

Aquí está la documentación: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Para Drupal 8:

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

Entonces el código es:

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

Como de costumbre, limpia tu caché una vez hecho.

Zuzuesque
fuente
19

Deshabilitar caché para una página específica

Deshabilite el caché para una página personalizada desde la declaración de ruta. Si desea deshabilitar la memoria caché para un controlador personalizado (módulo personalizado), tiene la no_cacheopción (YOUR_MODULE.routing.yml). Ejemplo: Archivo: 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'

Se agregó la opción de ruta 'no_cache' para marcar las respuestas de una ruta como no almacenables en caché

Vladislav
fuente
11

En Drupal 8, puede mencionar el caché como edad máxima hasta que desee que la salida de su página se almacene en caché. Para eliminar el caché de una página en particular (página Controlador), escriba 'max-age' => 0,.

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

Si necesita hacer algo con un módulo contrib puede usar un RouteSubscriber para solucionar el problema de caché. necesitas un servicio ... o simplemente ejecutarlo drupal grsi tienes consola 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);
  }
 }
}

Para obtener más información, consulte https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

Taggart Jensen
fuente
1

Puede usar este módulo para evitar el caché de drupal y también el caché del lado del servidor como barniz https://www.drupal.org/project/ape

Me funciona en el caché Varnish en el servidor acquia.

VishnuMoorthy
fuente