web-dev-qa-db-ja.com

キャッシュタグを使用して、キャッシュされたコンテンツを毎日削除するにはどうすればよいですか?

Drupal 8ページには、当日に有効な日固有の要素があります。キャッシュタグを追加して、定期的にニス/高速でパージできるようにしたいと思います。 Drupal8でキャッシュタグを定期的に無効にする方法はありますか?

ここにいくつかのFAQ/Asがあります:

  1. Max-ageを使用できないのはなぜですか?

max-ageを使用できますが、ページレベルのヘッダーであるため、複数のコンポーネントが設定しようとすると、非常に混乱する可能性があります。キャッシュタグは、コンポーネントに対して一種の自己完結型です。

  1. なぜcronを実行しないのですか?

これは、環境に固有であるため、明示的なcron /ジョブを避けてください。

2
vijaycs85

1日の最初のヒットでキャッシュをフラッシュするコードは次のとおりです。

  public function build() {
    ...
    ...
    ...
    $this->handleCacheTag($build['#cache']['tags']);
  }


  protected function handleCacheTag(&$tags) {
    // Get the current date number.
    $current_date_number = date('z');
    $last_date_number = \Drupal::state()->get('module_name.foo.date_counter', $current_date_number);
    // If last date in settings is different from current day, invalidate
    // tags.
    if ($last_date_number < $current_date_number) {
      $invalid_tags = range($last_date_number, $current_date_number);
      array_walk($invalid_tags, function(&$invalid_tag){
        $invalid_tag = 'foo:date.' . $invalid_tag;
      });
      Cache::invalidateTags($invalid_tags);
    }
    \Drupal::state()->set('module_name.foo.date_counter', $current_date_number);
    $tags[] = 'foo:date.' . $current_date_number;
  }
4
vijaycs85