Kiểm soát bộ đệm người dùng ẩn danh


7

Chúng tôi đã viết một số khối tùy chỉnh hiển thị nội dung động; thật không may, bộ đệm ẩn mặc định lưu trữ bộ đệm kết xuất đầu tiên của khối này (và không làm mới cho người dùng ẩn danh). Kiểm soát bộ nhớ cache dường như chỉ hoạt động cho người dùng xác thực. Có phải chúng ta đang thiếu một cái gì đó rõ ràng? Có thể kiểm soát bộ nhớ đệm ẩn danh trên cơ sở khối (hoặc trang) không?


Là khối thực hiện trong một mô-đun?
kiamlaluno

Câu trả lời:


11

Có hai bộ đệm trang khác nhau.

Bộ đệm ẩn trang động nội bộ hoạt động với tất cả các loại phần tử như khối và nút và được sử dụng các thẻ bộ đệm, bối cảnh bộ đệm và tuổi thọ tối đa của bộ đệm được cung cấp bởi các thành phần này.

Bộ đệm ẩn nội bộ dành cho các trang hoàn chỉnh cho người dùng ẩn danh và chỉ sử dụng thẻ bộ đệm.

Bạn có thể kiểm soát bộ đệm trang cho người dùng ẩn danh với một tham số.

Đi đến cấu hình nước hoa:

admin/config/development/performance

Và định cấu hình tuổi tối đa của bộ đệm trang với thời gian thông tin của bạn hợp lệ. Điều này cũng quan trọng đối với proxy và bộ đệm của trình duyệt, vì nó sẽ không giúp làm mất hiệu lực bộ đệm drupal, nếu trang được lưu trữ ở những nơi khác. Sau thời gian đó, trang sẽ hết hạn và sẽ được xây dựng lại. Theo tài liệu:

Định cấu hình bộ đệm trang bên trong Trên trang Hiệu suất, bạn có thể định cấu hình thời gian trình duyệt và proxy có thể lưu trang; cài đặt đó cũng được mô-đun Bộ đệm trang nội bộ tuân thủ. Không có cấu hình khác.

Nhưng điều này là không đúng sự thật. Bạn nên định cấu hình thời gian này cho proxy và bộ đệm của trình duyệt, nhưng bộ đệm trang bên trong không tôn trọng thời gian bạn đặt ở đó. Giải pháp đáng tin cậy duy nhất tôi tìm thấy là gỡ cài đặt mô-đun Bộ đệm trang nội bộ hoặc đặt thời gian hết hạn trong Trình đăng ký sự kiện (ví dụ: 3600 giây trong tương lai):

/ src/EventSubscacker/setExpiresSubscacker.php

<?php

namespace Drupal\mymodule\EventSubscriber;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class SetExpiresSubscriber implements EventSubscriberInterface {

  public function onResponse(FilterResponseEvent $event) {
    $request = $event->getRequest();
    $response = $event->getResponse();
    if ($event->isMasterRequest()) {
      $request_time = $request->server->get('REQUEST_TIME');
      $expires_time = (new \Datetime)->setTimestamp($request_time + 3600);
      $response->setExpires($expires_time);
    }
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = ['onResponse'];
    return $events;
  }

}

mymodule.service.yml

services:
  mymodule.setexpires:
    class: Drupal\mymodule\EventSubscriber\SetExpiresSubscriber
    tags:
      - { name: event_subscriber }

2
Bạn có thể vô hiệu hóa bộ đệm trang nội bộ bằng \ Drupal :: service ('page_cache_kill_switch') -> trigger (). Tất nhiên, nếu khối của bạn được hiển thị trên tất cả các trang thì điều đó thật vô nghĩa.
Berdir

Vâng, page_kill_switch đã giúp chúng tôi! Cảm ơn bạn!
gavz

@gavz Khi sử dụng công tắc, hãy kiểm tra curl --head, điều đó max-ageđúng trongCache-Control:
4k4

Bạn cũng có thể sử dụng lớp "RequestPolicyInterface" để từ chối bộ đệm ẩn theo một số tham số và yêu cầu. Xem api.drupal.org/api/drupal/ khăn để biết thêm thông tin.
Renrhaf

Để cho các cài đặt trang hiệu suất kiểm soát hết hạn bộ nhớ cache của trang bên trong, onResponse()phương thức của dịch vụ trong ví dụ này có thể được cập nhật để sử dụng $page_max_age = \Drupal::config('system.performance')->get('cache.page.max_age');thay vì mã hóa hết hạn đến một số giây cố định trong tương lai, chẳng hạn như 3600.
David Lanier


1

Nếu bạn cần bật Bộ đệm ẩn trang nội bộ (nghĩa là bạn không thể sử dụng Varnish hoặc giải pháp dựa trên bộ nhớ khác) và bạn chỉ muốn Bộ nhớ cache trang nội bộ tôn trọng thời gian được đặt tại admin/config/development/performance, bạn có thể thêm Người đăng ký sự kiện của riêng mình để sửa đổi FinishResponseSubscacker mà Drupal cung cấp. Thậm chí, bạn có thể sử dụng Bảng điều khiển Drupal để tạo hầu hết Người đăng ký Sự kiện cho bạn và sau đó lấy các bit khác từ Kết thúc Hoàn thành. Kết quả của bạn sẽ trông giống như thế này:

/**
 * Class MyModuleSubscriber.
 *
 * @package Drupal\my_module
 */
class MyModuleSubscriber implements EventSubscriberInterface {

  /**
   * Sets extra headers on successful responses.
   *
   * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
   *   The event to process.
   */
  public function onRespond(FilterResponseEvent $event) {
    if (!$event->isMasterRequest()) {
      return;
    }

    $request = $event->getRequest();
    $response = $event->getResponse();

    $this->setExpiresNoCache($response);

    return;

  }

  /**
   * Disable caching in ancient browsers and for HTTP/1.0 proxies and clients.
   *
   * HTTP/1.0 proxies do not support the Vary header, so prevent any caching by
   * sending an Expires date in the past. HTTP/1.1 clients ignore the Expires
   * header if a Cache-Control: max-age= directive is specified (see RFC 2616,
   * section 14.9.3).
   *
   * @param \Symfony\Component\HttpFoundation\Response $response
   *   A response object.
   */
  protected function setExpiresNoCache(Response $response) {
    $response->setExpires(REQUEST_TIME + 300);
  }

  /**
   * Registers the methods in this class that should be listeners.
   *
   * @return array
   *   An array of event listener definitions.
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = array('onRespond');
    return $events;

  }
}

Các mã hóa cứng ở trên có tuổi thọ bộ nhớ cache ở 300 giây, nhưng thay vào đó bạn có thể dễ dàng truy xuất cài đặt người dùng.


> "Bạn thậm chí có thể sử dụng Bảng điều khiển Drupal để tạo hầu hết Người đăng ký Sự kiện cho bạn," Tôi cần gì? Modul, điều khiển? Nơi để vượt qua codec này?
Frank Giesecke

Xin chào @FrankGiesecke, có một số cách để có được Bảng điều khiển Drupal. Xem drupalconsole.com
markfullmer 15/03/2017

Xin chào, Console chạy ngay bây giờ. Những tập tin nào tôi vẫn cần?
Frank Giesecke

0

Tôi nghĩ rằng bạn cần phải tắt mô-đun 'Bộ nhớ cache trang nội bộ' để bối cảnh bộ đệm hoạt động.

Với nội dung được bật 'Bộ nhớ cache trang nội bộ' cho người dùng ẩn danh được lưu trong bộ nhớ cache theo mặc định.

Nếu bạn tắt 'Bộ nhớ cache trang nội bộ', bạn vẫn cần nói với Drupal không lưu bộ đệm cho người dùng ẩn danh

$variables['#cache'] = [
  'contexts' => [
    // The "current user" is used above, which depends on the request,
    // so we tell Drupal to vary by the 'user' cache context.
    'user',
  ],
];

làm điều đó cho tôi - nhưng có lẽ không hoàn toàn chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.