Wie kann ich verhindern, dass eine bestimmte Seite zwischengespeichert wird?

14

Ich habe den Cache auf meiner Drupal 8-Site aktiviert und natürlich werden alle Seiten wie erwartet zwischengespeichert.

Ich möchte jedoch, dass eine bestimmte Seite diesen Cache umgeht.

In meinem Controller habe ich die Seite wie folgt erstellt:

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

Wie kann ich Drupal anweisen, meine Seite nicht im Cache zu speichern?

rpayanm
quelle

Antworten:

30

Für Drupal 7:

Drupal hat die Funktion drupal_page_is_cacheable (), mit der eine Seite auf nicht zwischenspeicherbar gesetzt werden kann.

Hier ist die Dokumentation: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Für Drupal 8:

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

Dann lautet der Code:

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

Bereinigen Sie Ihren Cache wie gewohnt .

Zuzuesque
quelle
18

Cache für eine bestimmte Seite deaktivieren

Deaktivieren Sie den Cache für eine benutzerdefinierte Seite in der Routendeklaration. Wenn Sie den Cache für einen benutzerdefinierten Controller (benutzerdefiniertes Modul) deaktivieren möchten, haben Sie die no_cacheOption (YOUR_MODULE.routing.yml). Beispiel: Datei: 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'

Die Routenoption 'no_cache' wurde hinzugefügt, um die Antworten einer Route als nicht zwischenspeicherbar zu markieren

Vladislav
quelle
10

In Drupal 8 können Sie den Cache als maximales Alter angeben, bis Ihre Seitenausgabe zwischengespeichert werden soll. Schreiben Sie, um den Cache einer bestimmten Seite (Controllerseite) zu entfernen 'max-age' => 0,.

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

Wenn Sie etwas mit einem Contrib-Modul tun müssen, können Sie das Cache-Problem mit einem RouteSubscriber beheben. Sie brauchen einen Dienst ... oder einfach laufen, drupal grwenn Sie eine Drupal-Konsole haben.

 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);
  }
 }
}

Weitere Informationen finden Sie unter https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

Taggart Jensen
quelle
1

Sie können dieses Modul verwenden, um den Drupal-Cache und auch den serverseitigen Cache wie Lack https://www.drupal.org/project/ape zu vermeiden

Es funktioniert bei mir im Varnish-Cache auf dem Acquia-Server.

VishnuMoorthy
quelle