ฉันจะป้องกันหน้าใดหน้าหนึ่งที่ถูกแคชได้อย่างไร


15

ฉันเปิดใช้งานแคชในไซต์ Drupal 8 ของฉันและแน่นอนว่าทุกหน้าจะถูกแคชตามที่คาดไว้

อย่างไรก็ตามฉันต้องการให้มีหน้าที่เฉพาะเจาะจงในการข้ามแคชนั้น

ในตัวควบคุมของฉันฉันสร้างหน้าดังต่อไปนี้:

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

ฉันจะบอก Drupal ไม่ให้แคชหน้าของฉันได้อย่างไร

คำตอบ:


31

สำหรับ Drupal 7:

Drupal มีฟังก์ชั่น drupal_page_is_cacheable () ซึ่งสามารถใช้ในการตั้งค่าหน้าเป็น uncacheable

นี่คือเอกสาร: 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 คุณสามารถพูดถึงแคชเป็นอายุสูงสุดจนกว่าคุณจะต้องการแคชของเพจของคุณ สำหรับการลบแคชของหน้าโดยเฉพาะอย่างยิ่ง (หน้า Controller), '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

มันทำงานให้ฉันในแคชวานิชบนเซิร์ฟเวอร์ acquia

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.