web-dev-qa-db-ja.com

ノードのキャッシュが更新時に自動的にクリアされない(断続的な問題)

5回のうち約1回、更新時にノードのキャッシュがクリアされない場合があります。更新によって作成されたリビジョンを表示したり、ノードを編集したりしても、変更は表示されません。最小キャッシュ存続時間は1分に設定されていますが、1分待ってcronを実行した後でも、自動的に消去されません。

この問題はサイトの繁忙期により多く発生するようで、開発環境で問題を再現することはできません(通常、一度に1人のユーザーしかいません)。キャッシュテーブルはすべてInnoDBであるため、ロックについて心配する必要はないということです。

同様の問題 選択した回答で、これは最小キャッシュ存続時間を適切に設定する問題にすぎないと述べています。しかし、私は this Drupal bug を発見しました。これは、ノードの更新では、その設定に関係なくキャッシュがクリアされる必要があることを意味します。たぶん、ソリューションが実装されたことはなく、これはまだ事実です。

更新

ビルド バグのパッチ および_hook_node_update_を使用して、私は次のことを試しました

_function MYMODULE_node_update($node)
{
   // Forcibly wipe this node's page view from the cache because, if a
   // minimum cache lifetime is in effect, cache_clear_all() will not
   // clear any page cache entries younger than that minimum.
   // 
   // Page cache cids are absolute URLs.  url() in absolute-mode will
   // get the aliased path if there is one, and we also wipe the
   // absolute version of the node/nid URL just in case.
   // Copied from http://drupal.org/node/256416#comment-838118
   global $base_url;
   cache_clear_all( url('node/'.$node->nid, array('absolute' => true))
                  , 'cache_page' );
   cache_clear_all($base_url .'/node/'. $node->nid, 'cache_page');
}
_

これにより、最小キャッシュ制限が回避され、そのノードのキャッシュのみがクリアされます。残念ながら、これは機能しませんでした

アップデート2

さらに掘り下げた後、cache_clear_all('field:node:<nid>', 'cache_field')(_<nid>_は関連するノードIDに置き換えられます)を実行すると、問題が発生したときに正しいキャッシュがクリアされることがわかりました。これをMYMODULE_node_update()フックに入れてみましたが、問題は解決しませんでした。

これを発見し、コードのパスをたどることで、 APCモジュール がキャッシングを処理しており、当初考えていたように、これがデータベースに格納されていないことも発見しました。

キャッシュがAPCによって処理されていることを知り、問題の断続的な性質を考慮すると、APCで発生する可能性のあるロックの問題に戻ります。それは理にかなっていますか?予備調査では何も明らかにされていません。

4
donut

APCモジュールのアップグレード の後、さらに問題が発生しました。 DrupalおよびAPCでの経験についてオフラインで他の人と話し、他の人がAPCでロックの問題を経験したことを確認しました。memcachedと Memcacheモジュール の使用に切り替え、すべての問題切り替え後、1年以上前から問題はありませんでした。

0
donut

APCモジュール をbeta3から7.X-1.0-beta4に更新しましたが、問題は修正されたようです。少なくともクライアントは数日間、これ以上の問題を報告しておらず、やや限定されたテストでは問題を再現できませんでした。

この問題の修正を示唆するベータ3とベータ4の間の変更ロットには何もありませんでした。これがそれを修正したものであるとは確信していませんが、他に手掛かりはありません。

1
donut