Drupal 7のWebサイトで、「匿名ユーザーのキャッシュページ」と「キャッシュブロック」が有効になっています。「最小キャッシュ存続時間」と「キャッシュページの有効期限」の両方が1日に設定されています。
たとえば、画像を編集してノードを更新し、匿名ユーザーとしてそのページにアクセスすると、新しい画像が表示されません。キャッシュを手動でクリアすると、ページが正しく表示されます。ノードが更新された後、キャッシュがクリアされないようです。
APIの抜粋:
_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をさらに検査すると、次のことがわかります。
_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)
)を使用してクリアされます。
コードには何も問題がないようです。たぶん、コードは必要なキャッシュのすべてをクリアしませんか?
問題は、1日の最小有効期間が設定されていることです。つまり、 cache_clear_all()
は、有効期間が1日未満のエントリを削除しません。これを1時間、またはサイトでより受け入れやすいものに設定してみてください(たとえば、新しいコンテンツまたは編集されたコンテンツの期間、および匿名ユーザーがコンテンツを表示する必要がある場合)。
db_delete()
を使用すると、最小有効期間に関係なく、「手動」でdbテーブルをクリアできます。