web-dev-qa-db-ja.com

匿名ユーザーのキャッシュの問題

匿名ユーザーに影響を与えるキャッシュの問題があります。

ブロックにフォームがあり、ユーザーがフォームに記入すると、PDFをダウンロードできます。これを望まないページでブロックを非表示にしますPDFダウンロードフォームを表示します。ブロックが非表示の場合、理想的にはPDF特定のページですが、ブロックは実際のページに関係なくキャッシュされて表示されます。これは匿名ユーザーのみの問題です。ログインしているユーザーには、キャッシュされているように見えるという問題はありませんPDFダウンロード間違ったページに表示されるブロック。

たとえば、キャッシュをクリアした後、誰かが最初にPDF利用可能なページAにアクセスし、次にPDFダウンロードフォームブロックがキャッシュされており、キャッシュされたバージョンもPDFダウンロードがないページBに表示されます。

同じ逆に、最初にページBにアクセスした場合、ブロックは属性display:noneでキャッシュされており、ページAにも表示されません。基本的に、ページの読み込みごとに可視性を再評価する必要があります。

ライブレンダリングされたコードを検査すると、ページ上でブロックIDが混同されていることが確認できるため、キャッシュの問題であると確信しています。例:bodyタグにはクラス「node-164」が含まれ、ノード164であり、ダウンロードPDFクラス「PDF-node-205」が含まれているため、ノード205のキャッシュされたバージョン。CSSクラス名としてファイル名も含まれます。これは明らかに、別のページノードのブロックです。

ページキャッシュ、動的キャッシュ、およびtwigキャッシュを無効にしてみましたが、それでも同じ問題が発生します。また、匿名ユーザーでのみ発生します。ログインしたユーザーはこれらのキャッシュされたブロックが間違ったページに表示されることを確認してください。

誰かがこれに遭遇したり、Drupalが使用している可能性のある別のキャッシュ方法を知っていることを知っていますか?

2
mjrailey

私が正しく理解していれば、ブロックがキャッシュされることは問題ありませんが、各パス/ URLはフォームの独自の「バージョン」を持つことができますよね?その場合、Drupalこのブロックは現在のパス/ URLに応じて変化することを通知する必要があります。Drupal 8では、「 cache contexts "これを実行します。キャッシュコンテキストは、戻り値が変化する可能性がある外部要因を定義します。

これがわかったので、 この質問 があなたの質問とかなり似ていることに気づくでしょう。

変更レコード に記載されているように、BlockCaseクラスのgetCacheContexts()メソッドをオーバーライドすることにより、ブロックはキャッシュコンテキストを定義できます。このメソッドをオーバーライドすると、ブロッククラスで次のようになります。

/**
 * {@inheritdoc}
 */
public function getCacheContexts() {
  return Cache::mergeContexts(parent::getCacheContexts(), ['url.path']);
}

ご覧のとおり、私はurl.pathコンテキストはこちら。 Drupalコアによって提供されるコンテキストのリストは ドキュメント にあります。

2
marcvangend

この場合の最も迅速かつ効果的な方法は、max-ageをゼロに設定してブロックのキャッシュを無効にすることです。

$build['#cache']['max-age'] = 0;

この場合、キャッシュコンテキストを定義しても意味がありません。すべてのURLのキャッシュされたブロックがキャッシュビンをいっぱいにしてしまいますが、使用されることはないからです。

匿名ユーザーはページキャッシュから提供されます。デフォルトでは、すべてのURLに対して異なるページがキャッシュされます。

ブロックキャッシュをオフにできなかったため、デバッグ作業は成功しませんでした。キャッシングモジュールをアンインストールするだけでは不十分です。コアはこれなしでブロックをキャッシュできます。 nullキャッシュバックエンドを使用する必要があります。

0
4k4