Drupal 8はRest API呼び出しをキャッシュします


7

クライアントとして角度8のヘッドレスモードでDrupal 8を使用しています。私が直面している問題は、DrupalがAPIへの呼び出しをキャッシュすることです。たとえば、ランダムな順序でアイテムを提供することを想定しているエンドポイントがありますが、これは発生せず、特定の順序でのみキャッシュアイテムを取得します。どうすればこれを克服できますか?キャッシュモジュールを無効にしようとしましたが、それでも同じ動作が得られます

回答:


13

Drupalには2つのレベルのキャッシングがあります。

1.)動的ページキャッシュ

jsonレスポンスに正しいキャッシュメタデータを提供する必要があります。

たとえば、構成またはコンテンツエンティティのキ​​ャッシュプロパティを使用する

$response->addCacheableDependency($entitiy);

または、キャッシュ可能なメタデータオブジェクトを作成し、これを応答に追加します。

$build = [
  '#cache' => [
    'contexts' => ['url.query_args'],
    'tags' => ['node:1', 'node_list'],
    'max-age' => 300,
  ],
];
$cache_metadata = \Drupal\Core\Cache\CacheableMetadata::createFromRenderArray($build);
$response->addCacheableDependency($cache_metadata);

これをカスタムコントローラーで使用するか、イベントサブスクライバーで実装して、他のモジュール(コアまたはcontrib)からの応答を変更できます。

2.)内部ページキャッシュ

モジュール内部ページキャッシュは、キャッシュメタデータに関係なく、匿名要求に対するすべての応答をキャッシュします。このモジュールをアンインストールして、このキャッシュを無効にすることができます。

代替ソリューション

クライアント側で、すべての要求に異なるクエリ文字列を追加して、新しい応答を取得します。

node/123?_format=json&time=123456789

これにより、内部ページキャッシュ動的ページキャッシュの一部が無効になります。

リファレンス:https : //www.drupal.org/docs/8/core/modules/rest/javascript-and-drupal-8-restful-web-services


1
\ Drupal :: service( 'page_cache_kill_switch')-> trigger();を使用して、特定のルートの内部ページキャッシュを無効にすることもできます。また、drupal.org / node / 2352009追加された場合は、max-ageも考慮されます。
Berdir

1
Berdirの\ Drupal :: service( 'page_cache_kill_switch')-> trigger();の提案を追加する必要がありました。それ以外の場合は、匿名ユーザー用に引き続きキャッシュされます
Matt

5

エンドポイントのキャッシュを完全に無効にすることを好みます。これは、MaxAgeがゼロのキャッシュ可能な依存関係をResourceResponseオブジェクトに追加することで実行できます。

次に例を示します。

$response = new ResourceResponse($data);
$disable_cache = new CacheableMetadata();
$disable_cache->setCacheMaxAge(0);

$response->addCacheableDependency($disable_cache);

return $response;

これは開発にとっては素晴らしいアイデアのようですが、本番サイトでは、応答を変化させる可能性のあるパラメーターを追加しaddCacheableDependencyて、サイトのパフォーマンスとスケーラビリティを高めることができます。
-greggles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.