Umi Blog
ウミブログ

こんにちは。
1年以上前にDrupal Meetup Tokyoにお邪魔した際にキャッシュのことが話題にあがり、「Drupalのキャッシュって一体何種類あるんだろう?」と疑問に思いました。当時は右も左もわからない初心者だったのでドキュメント読んでも欲しい答えが見つからず、放置してたのですが、今回時間があったので改めて調べてみました。同じ疑問を持つ方々の参考になれば幸いです。
キャッシュとは、一度使用したデータを取り出しやすいかたちで保存しておくことを指します。キャッシュを使用することで二回目以降に同じ計算をする必要がなくなり、プログラムの高速化に役立ちます。
Drupalを動かす際にサーバーサイドで考慮すべきキャッシュとしては主に以下のようなものがあります。
今回は4つ目の「Drupal自体のキャッシュ」について説明していきます。
Drupal 8にはあらかじめさまざまな種類のキャッシュが実装されています。Drupal 8の標準インストールで使える主なキャッシュの種類(「ビン」と呼びます)は以下になります。
というわけでいきなりタイトルの答えですが、Drupal 8のキャッシュは標準インストールで約10種類あることになります。
この他にコントリビュートモジュールをインストールすると新しいビンが追加されることがあります。それぞれのキャッシュはcache_[BIN_NAME]というテーブルに保存されているので興味のある方は覗いてみてください。
このようにDrupal 8ではキャッシュが多いため、開発中にキャッシュとファイルやDBで不整合が起きてバグのように見える現象が起きることがよくあります。初心者の方はエラーに遭遇したり、「変更が反映されていない」と感じることがあったら、とりあえず「キャッシュクリア」で全キャッシュを削除しましょう。
キャッシュクリアは管理画面(/admin/config/development/performance)かdrush crで行うことができます。
また、PageとDynamic Page Cacheのキャッシュは無効化できるので、開発中はそうするのがおすすめです。
ちなみに、キャッシュクリア以外では、以下のような条件でキャッシュが削除されます。
キャッシュが効くはずの箇所でキャッシュクリアしてないのに情報が更新されていたら、上記のいずれかの条件が満たされていたと考えることができます。
ちなみに私はcron時にキャッシュクリアもされてそうなイメージを持ってたのですが、今回調べてみてそれは勘違いだということがわかりました...。
Drupalが他のCMSに比べて高速な理由の一つにきめ細かいキャッシュが挙げられることが多いのですが、キャッシュの種類が多いと以下のようなデメリットもあるようです。
1つ目の問題については、Drupal 8.4からsettings.phpでキャッシュの最大件数を指定できるようになりました。例えばRenderビンのキャッシュを最大1000件にしたい場合は、以下のように書きます。
$settings['database_cache_max_rows']['bins']['render'] = 1000;
これによりcron時に1000件を超えるキャッシュは削除されるようになります。ちなみにデフォルトでは全てのビンが最大5000件になっています。
Database cache bins are now fixed size — no more unlimited growth
2つ目と3つ目についてはこれからの課題になりそうです。
今回のまとめです。
settings.phpから設定できるDrupalは知れば知るほどよくできてるな〜と思うことが多いのですが、キャッシュもここまで何重にも仕込まれてるとはびっくりしました。ちなみにCache APIを使えば簡単にカスタムキャッシュを追加することも可能なので、興味のある方は試してみてくださいね。
小さなご意見も、私たちにとっては大きなヒントです!
ぜひ率直なご感想をお寄せください
この

Masters of Drupal Engineering.
人に、