KernelEvents :: REQUEST không được kích hoạt trên các trang được lưu trữ


12

Tôi đang cố gắng triển khai thuê bao sự kiện KernelEvents :: REQUEST để thực hiện một số hành động khi tải trang.

Tôi cần sự kiện này để kích hoạt bất kể trang được yêu cầu có tồn tại trong bộ đệm Drupal hay không - có vẻ như KernelEvents :: REQUEST không kích hoạt khi Drupal phục vụ thứ gì đó từ bộ đệm.

Có một sự kiện nào tôi có thể sử dụng để đạt được điều này hay tôi phải thực hiện các yêu cầu của mình dưới dạng một số phần mềm trung gian?


1
Sự kiện YÊU CẦU ĐÃ được kích hoạt, nếu không sẽ không có phản hồi. IMHO ES của bạn có trọng lượng xấu và dịch vụ http_middleware.page_cache (hoặc bộ đệm trang động) đang dừng việc truyền bá sự kiện hơn nữa, do đó ES của bạn sẽ không được kích hoạt.

Trọng lượng / mức ưu tiên ES được đặt thành 20

Như 4k4 đã viết, page_cache cho người dùng ẩn danh là một phần mềm trung gian và xảy ra rất lâu trước sự kiện YÊU CẦU. Bạn có thể viết phần mềm trung gian của riêng bạn đến sớm hơn, nhưng bạn có thể muốn xem xét lại thẩm định của mình. Chính xác những gì cần phải xảy ra sớm như vậy? Hãy nhớ rằng bộ nhớ đệm trang ẩn danh thậm chí có thể xảy ra trong việc làm mờ các phần mềm bên ngoài khác hoặc thậm chí chính các trình duyệt. Có một cái nhìn về cách mô-đun thống kê cốt lõi theo dõi các lượt truy cập của trang: Với javascript sẽ ping máy chủ khi người dùng thực thi nó.
Berdir

@Berdir Đó là cung cấp xác thực http cho một trang web, tương tự như mô-đun Shield - vì vậy tôi nghĩ rằng điều này thể hiện một ví dụ hợp lệ về một cái gì đó cần được xử lý càng sớm càng tốt trong yêu cầu. (Tôi biết có bản vá mô-đun D8 Shield được triển khai dưới dạng phần mềm trung gian - Tôi giả sử vì giới hạn này).

Câu trả lời:


12

Bộ đệm động đăng ký một sự kiện có mức độ ưu tiên 27. Nếu bạn muốn mã của mình chạy trước đó, bạn phải sử dụng mức độ ưu tiên> 27:

  public static function getSubscribedEvents() {
    $events = [];

    // Run after AuthenticationSubscriber (necessary for the 'user' cache
    // context; priority 300) and MaintenanceModeSubscriber (Dynamic Page Cache
    // should not be polluted by maintenance mode-specific behavior; priority
    // 30), but before ContentControllerSubscriber (updates _controller, but
    // that is a no-op when Dynamic Page Cache runs; priority 25).
    $events[KernelEvents::REQUEST][] = ['onRequest', 27];

Chạy DynamicPageCacheSubscacker :: onRequest ..


Ưu tiên được đặt thành 20

Tôi nghĩ vấn đề bạn gặp phải là với sự kiện từ bộ đệm động, tôi đã chỉnh sửa câu trả lời của mình.
4k4

cảm ơn @ 4k4, nhưng ngay cả với mức ưu tiên được đặt thành 30, nó vẫn hoạt động như cũ (tôi đã cài đặt lại mô-đun và xóa tất cả bộ nhớ cache sau khi thực hiện thay đổi). Còn ý tưởng nào khác không?

Có hai bộ đệm. Bây giờ bạn đã ưu tiên hơn bộ đệm động, vẫn còn bộ đệm trang. Bộ đệm trang được thực thi trước kernel chính. Bạn có thể gỡ cài đặt mô-đun này và kiểm tra xem hiệu suất có ổn không nếu không có nó.
4k4

Tôi có thể xác nhận rằng điều này làm việc cho tôi. Tôi đã có một chuyển hướng chỉ xảy ra một lần - trước khi trang được lưu trữ. Khi tôi thêm một ưu tiên ['checkForRediret', 30];thì nó hoạt động như mong đợi.
Cyclonecode

5

Drupal 8 có hai cấp độ bộ đệm, bộ đệm trang và bộ đệm trang động.

Có, bạn có thể chặn bộ đệm trang động như những gì @ 4k4 đã đề cập. Vấn đề bạn gặp phải có nhiều khả năng chặn bộ đệm trang. Chìa khóa là ở đây .

Có một vài giải pháp cho việc này:

  1. Thêm lớp mới thực hiện 'HttpKernelInterface' và đăng ký 'http_middleware' với mức độ ưu tiên cao hơn 200 (280 sẽ làm). Xem lớp 'PageCache' và các triển khai để tham khảo.

  2. Tạo lớp mới để thay đổi 'PageCache' hiện có bằng cách mở rộng từ 'ServiceProviderBase'. Kiểm tra này để tham khảo ở đây . Sau đó, tạo lớp mới để mở rộng 'PageCache'.

Đây là tài liệu tham khảo:

Đây là StaticCacheServiceProvider.php:

/**
 * Modifies the language manager service.
 */
class StaticCacheServiceProvider extends ServiceProviderBase
{
  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container)
  {
    // Overrides language_manager class to test domain language negotiation.
    $definition = $container->getDefinition('http_middleware.page_cache');
    $definition->setClass('Drupal\your_module\StackMiddleware\StaticCache');
  }
}

Đây là StaticCache.php:

/**
 * Executes the page caching before the main kernel takes over the request.
 */
class StaticCache extends PageCache
{
  /**
   * {@inheritdoc}
   */
  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
  {
    // do special logic here.

    $response = parent::handle($request, $type, $catch);

    return $response;
  }
}

Hy vọng giúp.


Điều này rất hữu ích, cảm ơn bạn, tôi đã giải quyết vấn đề bằng cách thực hiện giải pháp 1.
Remco Hoeneveld
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.