Як я можу запобігти кешування певної сторінки?


15

Я активував кеш на моєму сайті Drupal 8, і звичайно всі сторінки кешовані як очікувалося.

Однак я хотів би мати певну сторінку, що обходить цей кеш.

У своєму контролері я створив сторінку наступним чином:

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

Як я можу сказати Drupal не кешувати мою сторінку?

Відповіді:


31

Для Drupal 7:

Drupal має функцію drupal_page_is_cacheable (), яку можна використовувати для встановлення сторінки, на яку не можна керувати.

Ось документація: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Для Drupal 8:

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

Тоді код:

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

Як завжди, очистіть кеш-пам'ять після закінчення.


19

Вимкнути кеш для певної сторінки

Вимкнути кеш для спеціальної сторінки з оголошення маршруту. Якщо ви хочете відключити кеш-пам'ять для користувацького контролера (Спеціальний модуль), у вас є 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", щоб позначити відповіді маршруту як неможливі кешування


12

У Drupal 8 ви можете згадати кеш як максимальний вік, поки ви не захочете, щоб ваша сторінка була кешована. Для видалення кешу певної сторінки (сторінки контролера) напишіть 'max-age' => 0,.

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

3

Якщо вам потрібно щось зробити з модулем contrib, ви можете скористатися RouteSubscriber для вирішення проблеми кешу. вам потрібна послуга ... або просто запустіть, drupal grякщо у вас консоль 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);
  }
 }
}

докладнішу інформацію див. https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


1

Ви можете використовувати цей модуль, щоб уникнути кеша drupal, а також кешу на стороні сервера, як лак https://www.drupal.org/project/ape

Він працює для мене в кеш-файлі Varnish на сервері accia.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.