web-dev-qa-db-ja.com

キャッシュの問題:ノードの更新

Drupal 7のWebサイトで、「匿名ユーザーのキャッシュページ」と「キャッシュブロック」が有効になっています。「最小キャッシュ存続時間」と「キャッシュページの有効期限」の両方が1日に設定されています。

たとえば、画像を編集してノードを更新し、匿名ユーザーとしてそのページにアクセスすると、新しい画像が表示されません。キャッシュを手動でクリアすると、ページが正しく表示されます。ノードが更新された後、キャッシュがクリアされないようです。

APIの抜粋:

modules/node/node.pages.inc

_function node_form_submit($form, &$form_state) {
  $node = node_form_submit_build_node($form, $form_state);
  $insert = empty($node->nid);
  node_save($node);

  // Do stuff...

  // Clear the page and block caches.
  cache_clear_all();
}
_

ノードの挿入または更新が必要かどうかに関係なく、ノードが保存された後に関数cache_clear_allが呼び出されることに注意してください。

APIをさらに検査すると、次のことがわかります。

modules/node/node.module

_function node_save($node) {

  ...

    // Save the node and node revision.
    if ($node->is_new) {
      drupal_write_record('node', $node);
      ...
    }
    else {
      drupal_write_record('node', $node, 'nid');
      ...
    }

    ...

    // Clear the static loading cache.
    entity_get_controller('node')->resetCache(array($node->nid));

  ...
}
_

繰り返しになりますが、すべてが本来あるべき状態のようです。キャッシュは、エンティティAPI(public DrupalDefaultEntityController::resetCache(array $ids = NULL))を使用してクリアされます。

コードには何も問題がないようです。たぶん、コードは必要なキャッシュのすべてをクリアしませんか?

5
Bart

問題は、1日最小有効期間が設定されていることです。つまり、 cache_clear_all() は、有効期間が1日未満のエントリを削除しません。これを1時間、またはサイトでより受け入れやすいものに設定してみてください(たとえば、新しいコンテンツまたは編集されたコンテンツの期間、および匿名ユーザーがコンテンツを表示する必要がある場合)。

3
jhedstrom

db_delete()を使用すると、最小有効期間に関係なく、「手動」でdbテーブルをクリアできます。