Jak mogę zapobiec buforowaniu określonej strony?

15

Aktywowałem pamięć podręczną w mojej witrynie Drupal 8 i oczywiście wszystkie strony są buforowane zgodnie z oczekiwaniami.

Chciałbym jednak, aby ta strona pominęła tę pamięć podręczną.

W moim kontrolerze zbudowałem stronę w następujący sposób:

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

Jak mogę powiedzieć Drupalowi, aby nie buforował mojej strony?

rpayanm
źródło

Odpowiedzi:

31

W przypadku Drupal 7:

Drupal ma funkcję drupal_page_is_cacheable (), której można użyć do ustawienia strony na nieuleczalną.

Oto dokumentacja: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

W przypadku Drupal 8:

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

Zatem kod to:

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

Jak zwykle wyczyść pamięć podręczną po zakończeniu .

Zuzuesque
źródło
19

Wyłącz pamięć podręczną dla określonej strony

Wyłącz pamięć podręczną niestandardowej strony z deklaracji trasy. Jeśli chcesz wyłączyć pamięć podręczną dla kontrolera niestandardowego (moduł niestandardowy), masz no_cacheopcję (YOUR_MODULE.routing.yml). Przykład: Plik: 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'

Dodano opcję trasy „no_cache”, aby oznaczyć odpowiedzi trasy jako nieusuwalne

Vladislav
źródło
12

W Drupal 8 możesz podać pamięć podręczną jako maksymalny wiek, dopóki nie chcesz, aby pamięć podręczna była buforowana. Aby usunąć pamięć podręczną określonej strony (strony kontrolera), napisz 'max-age' => 0,.

public function myPage() {
  return [
   '#markup' => time(),
   '#cache' => ['max-age' => 0,],    //Set cache for 0 seconds.
  ];
} 
Ashish Deynap
źródło
3

Jeśli potrzebujesz coś zrobić z modułem contrib, możesz użyć RouteSubscriber, aby naprawić problem z pamięcią podręczną. potrzebujesz usługi ... lub po prostu uruchom, drupal grjeśli masz konsolę 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);
  }
 }
}

więcej informacji patrz https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

Taggart Jensen
źródło
1

Możesz użyć tego modułu, aby uniknąć pamięci podręcznej drupal, a także pamięci podręcznej po stronie serwera, takiej jak lakier https://www.drupal.org/project/ape

Działa dla mnie w pamięci podręcznej Varnish na serwerze acquia.

VishnuMoorthy
źródło