캐시 된 페이지에서 KernelEvents :: REQUEST가 실행되지 않습니다


13

페이지로드에 대한 작업을 수행하기 위해 KernelEvents :: REQUEST 이벤트 구독자를 구현하려고합니다.

요청한 페이지가 Drupal 캐시에 있는지 여부에 관계없이이 이벤트가 발생해야합니다. Drupal이 캐시에서 무언가를 제공 할 때 KernelEvents :: REQUEST가 실행되지 않는 것 같습니다.

이를 달성하기 위해 사용할 수있는 이벤트가 있습니까, 아니면 어떤 형태의 미들웨어로 요구 사항을 구현해야합니까?


1
REQUEST 이벤트가 트리거되어야하며, 그렇지 않으면 응답이 없습니다. 이럴 당신의 ES 나쁜 무게가 따라서 귀하의 ES가 트리거되지 않습니다, 더 및 이벤트의 http_middleware.page_cache (또는 동적 페이지 캐시) 서비스가 중지되는 전파를.

ES 가중치 / 우선 순위는 20으로 설정

4k4가 쓴 것처럼 익명 사용자를위한 page_cache는 미들웨어이며 REQUEST 이벤트 이전에 발생합니다. 이전에 제공되는 미들웨어를 직접 작성할 수 있지만 접근 방식을 다시 고려할 수 있습니다. 무엇이 그렇게 일찍 일어나야합니까? 익명의 페이지 캐싱은 다른 외부 소프트웨어 또는 브라우저 자체에서 니스를 칠 때도 발생할 수 있습니다. 핵심 통계 모듈이 페이지 방문을 추적하는 방법을 살펴보십시오. 사용자가 서버를 실행할 때 서버를 핑하는 자바 스크립트로.
Berdir

@Berdir Shield 모듈과 비슷한 사이트에 http 인증을 제공하는 것이므로 요청에서 가능한 빨리 처리 해야하는 유효한 예를 나타냅니다. (미들웨어로 구현 된 D8 Shield 모듈 패치가 있음을 알고 있습니다.이 제한 때문에 가정합니다.)

답변:


14

동적 캐시는 우선 순위가 27 인 이벤트를 구독합니다. 코드를 실행하기 전에 우선 순위> 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];

DynamicPageCacheSubscriber :: onRequest를 실행합니다 .


우선 순위는 20로 설정

나는 당신이 가진 문제가 동적 캐시의 이벤트와 관련이 있다고 생각합니다. 내 답변을 편집했습니다.
4k4

@ 4k4 덕분에 우선 순위가 30으로 설정되어 있어도 여전히 동일하게 작동합니다 (모듈을 다시 설치하고 변경 후 모든 캐시를 지 웠습니다). 다른 아이디어가 있습니까?

두 개의 캐시가 있습니다. 이제 동적 캐시보다 우선 순위가 높으므로 여전히 페이지 캐시가 있습니다. 페이지 캐시는 기본 커널보다 먼저 실행됩니다. 이 모듈을 제거하고 성능이 정상인지 테스트 할 수 있습니다.
4k4

나는 이것이 나를 위해 일한 것을 확인할 수 있습니다. 페이지가 캐시되기 전에 한 번만 발생하는 리디렉션이있었습니다. 우선 순위 ['checkForRediret', 30];를 추가하면 예상대로 작동했습니다.
Cyclonecode

6

Drupal 8에는 페이지 캐시와 동적 페이지 캐시의 두 가지 레벨 캐시가 있습니다.

예, @ 4k4에서 언급 한 것처럼 동적 페이지 캐시를 가로 챌 수 있습니다. 발생한 문제가 페이지 캐시를 가로 챌 가능성이 높습니다. 열쇠는 여기있습니다 .

이에 대한 몇 가지 해결책이 있습니다.

  1. 'HttpKernelInterface'를 구현하는 새 클래스를 추가하고 우선 순위가 200보다 높은 'http_middleware'를 등록하십시오 (280). 'PageCache'클래스 및 참조 구현을 참조하십시오.

  2. 'ServiceProviderBase'에서 확장하여 기존 'PageCache'를 변경할 새 클래스를 작성하십시오. 여기 를 참조 하십시오 . 그런 다음 'PageCache'를 확장 할 새 클래스를 작성하십시오.

다음은 코드 참조입니다.

이것은 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');
  }
}

이것은 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;
  }
}

희망이 도움이됩니다.


감사합니다. 솔루션 1을 구현하여 문제를 해결했습니다.
Remco Hoeneveld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.