キャッシュ

目次

キャッシュ機能

a-blog cms では複数のキャッシュを使い、パフォーマンスを高めています。
ここでは使用されているキャッシュの種類とクリア方法を確認しましょう。

キャッシュの種類

ページ キャッシュ

CMSでレンダリングされたHTMLをキャッシュします。このキャッシュにより2回目のアクセスは、ほとんどのCMSの処理を飛ばすことができるので、 表示速度に大きく影響します。特に理由がなければ「有効」にしましょう。詳しくは「ページキャッシュについて」をご確認ください。

テンプレート キャッシュ

テンプレートをキャッシュします。テンプレートキャッシュがあることにより、テンプレートの組み立てを毎回することがなくなるので、 ページ表示速度が高速になります。テンプレート修正した時などはキャッシュをクリアする必要があるため注意事項がいくつかあります。 詳しくは「テンプレートキャッシュについて」をご確認ください。

コンフィグ キャッシュ

CMSのコンフィグ設定をキャッシュします。特にキャッシュについては意識する必要はなく、コンフィグを変更すると自動的にキャッシュはクリアされるようになります。

カスタムフィールド キャッシュ

コンテンツのカスタムフィールド情報をキャッシュします。特にキャッシュについては意識する必要はなく、コンテンツ更新時などに自動的にキャッシュはクリアされるようになります。

一時的なキャッシュ

さまざまな情報をキャッシュします。例えばエントリーの情報や、プログラムの変数などをキャッシュしています。 特にキャッシュについて意識する必要はなく、コンテンツ更新時などに自動的にキャッシュはクリアされるようになります。

キャッシュのクリア方法

キャッシュのクリア方法について説明します。

ページキャッシュ以外のクリア方法

ページキャッシュ以外のキャッシュは 「ルートブログ」で「編集者以上」 のユーザーのみキャッシュのクリアが可能です。 ルートブログのダッシュボードで、クリアしたいキャッシュにチェックをつけて「キャッシュをクリア」ボタンを押してください。



ページキャッシュのクリア方法

ページキャッシュのクリアは「編集者以上」のユーザーが各ブログでキャッシュをクリアできるようになっております。
ダッシュボードで「ページキャッシュ」にチェックをつけて「キャッシュをクリア」ボタンを押してください。

各ブログでキャッシュクリアをすると、そのブログだけのキャッシュがクリアされるわけではなく、 各ブログのページキャッシュの設定によってクリア範囲が変わります。 詳しくは「ページキャッシュについて」をご確認ください。


テンプレートキャッシュについて

テンプレートキャッシュについて詳しくみていきます。

テンプレートキャッシュを有効にする

「private/config.system.yaml」に以下の記述をすると機能が有効化されます。

template_cache: on

また「DEBUG_MODE」時はテンプレートキャッシュが有効になりません。 テンプレートキャッシュを使いたい場合は「config.server.php」で「DEBUG_MODE」を「0」にしましょう。

define('DEBUG_MODE', 0);

テンプレートキャッシュが使える条件(制限事項)

テンプレートキャッシュを利用するためには、テンプレートの作り方に制限があります。
インクルード文の中に使用できるグローバル変数が限定されています。

<!-- 以下のようなインクルード文で使用するグローバル変数が限定されます。 -->

@include("/admin/entry/bcd/%{BCD}.html")

使用できるグローバル変数

  • %{ECD}
  • %{BCD}
  • %{PBCD}
  • %{RBCD}
  • %{CCD}
  • %{PCCD}
  • %{RCCD}
  • %{ALIAS_CODE}
  • %{IS_ADMIN}
  • %{MODULE_NAME}
  • %{MODULE_ID}
  • %{ADMIN_PATH}
  • %{ADMIN_PATH_MID}

以下のような 正規表現 で全文検索すると、インクルード文の中でグローバル変数を使っている箇所を検索できます。 (@include方式のみ)

@include\(['"][^'"]*%\{[^\}]+\}

テンプレートキャッシュが有効時は、テンプレートを編集しても反映されません。
ローカル環境などで開発時は「DEBUG_MODE」をONにして、キャッシュされないように開発し、本番環境はキャッシュをONにするのがいいでしょう。

本番環境反映時には、ダッシュボードからテンプレートキャッシュのクリアを忘れないようにしましょう。

ページキャッシュについて

ページキャッシュについて詳しく紹介します。

ページキャッシュを有効にする

ページキャッシュを有効にするためには、いくつか条件があります。

  • DEBUG_MODEがオフであること
  • コンフィグ or コンフィグセットで キャッシュ設定がONであること
  • ログアウトしている時
  • 読者ユーザーがログインしている時(要設定)

コンフィグでページキャッシュを有効化

管理ページ > コンフィグ > キャッシュ機能 ページの「ページキャッシュ」にチェックをつけることで有効になります。



読者ユーザーでログイン中でもページキャッシュを有効化

通常ログインしているときはページキャッシュは有効化されませんが、読者ユーザーの場合はログインしていてもページキャッシュを有効化することができます。
たとえば、会員制サイトなどでログインしていても表示内容がそこまで変わらない場合に有用です。

有効化する方法

private/config.system.yaml に以下記述を追加します。

subscriber_cache: on

この機能を有効化すると、ログインしていてもページキャッシュが効いてしまいます。ログインしているユーザー固有の情報(マイページなど)は、 キャッシュしないように、マイページはキャッシュ設定をオフにする、JavaScriptでもってくるなど対策が必要です。

ページキャッシュ設定

ページキャッシュは、サイトの構造やサイトの更新頻度、アクセス数などによって、キャッシュの戦略が変わってきます。

設定箇所

ページキャッシュの設定は、管理ページ > コンフィグ > キャッシュ機能 で行います。
コンフィグなので、ブログ毎の設定または、コンフィグセットでの設定となります。



設定項目

ページキャッシュ

チェックをつけることにより、ページキャッシュ機能が有効化されます。

POST時のキャッシュクリア

チェックをつけることにより、エントリー保存した時やコンフィグ変更、モジュール変更などの更新系の操作(POST)をした時に、ページキャッシュをクリアをするようになります。
ただしエントリー詳細ページのキャッシュは、ここの設定にかかわらず、エントリー更新時に該当エントリーのキャッシュをクリアします。

キャッシュ有効時間

キャッシュの有効時間を秒数で設定します。この有効時間はエントリー詳細ページ以外のキャッシュ有効時間となります。

エントリーキャッシュ有効時間

エントリー詳細ページのキャッシュ有効時間を秒数で設定します。

キャッシュクリアの対象ブログ

このブログでキャッシュがクリアされた時に、他のブログのキャッシュもクリア対象にするか設定を行います。

実行ブログのみ : キャッシュクリアが実行されたブログのみのキャッシュをクリアします。

実行ブログと下階層のブログ : キャッシュクリアが実行されたブログと、そのブログの下階層ブログのキャッシュをクリアします。

実行ブログと親階層のブログ : キャッシュクリアが実行されたブログと、そのブログの親階層ブログのキャッシュをクリアします。

全ブログ : すべてのブログのキャッシュをクリアします。

サイト構造をみて対象となるブログを設定しましょう。たとえば設定ブログの情報が、そのブログのみで使われているのであれば「実行ブログのみ」で大丈夫です。
他には、設定ブログの情報が「ルートブログ」で利用されているのであれば「実行ブログと親階層のブログ」を選択しましょう。

クライアントキャッシュ設定

ブラウザに保存するキャッシュ有効時間を秒数で指定します。キャッシュヒット時はサーバーへのアクセスがないので、非常に高速にページ表示ができます。

クライアントキャッシュは、CMS側でクリアできないキャッシュとなります。有効時間が過ぎるか、エンドユーザーがブラウザのキャッシュを削除するしかありません。
なので、クライアントキャッシュに長い有効期限を設定するのはやめましょう。数分程度が推奨です。

キャッシュ戦略

ページキャッシュは設定項目も多いため、キャッシュ設定例を2つほど紹介します。

更新頻度が低い場合のページキャッシュ設定例

1週間に一回など更新頻度が少ないサイトであれば、キャッシュ有効時間を伸ばしPOST時にキャッシュをクリアするようにします。 更新頻度が少ないので、POST時のキャッシュクリアも頻繁に発生せず、キャッシュの有効時間も長いので、キャッシュヒット率もあがります。

  • ページキャッシュ: 有効
  • POST時のキャッシュクリア: 有効
  • キャッシュ有効時間: 2592000秒(30日間)
  • エントリーキャッシュ有効時間: 2592000秒(30日間)
  • キャッシュクリアの対象ブログ: サイト構成に沿って適切に設定
  • クライアントキャッシュ設定: 120秒

更新頻度が高く、アクセス数の多い場合のページキャッシュ設定例

更新頻度が高く、アクセス数の多いサイトの場合、POST時のキャッシュクリアはしないようにします。 更新頻度が高いので、その都度キャッシュをクリアしてしまうと、キャッシュのヒット率が下がってしまうからです。

またキャッシュクリアをPOST時にしてしまうと、キャッシュが一気に消え、瞬間的にキャッシュヒット率が極端に下がり、サーバーの負荷も上がってしまいます。 そこでキャッシュの有効時間を短くし、キャッシュの有効時間でばらばらにキャッシュがクリアしていくようにしています。

ただしエントリーのキャッシュ時間は長くし、エントリー更新時のみキャッシュがクリアされるようにしています。
注意点はエントリー詳細ページにエントリー情報以外の情報があると、その情報が更新されないので、JavaScriptなどでひっぱってくるなどの対応が必要です。

  • ページキャッシュ: 有効
  • POST時のキャッシュクリア: 無効
  • キャッシュ有効時間: 300秒(5分間)
  • エントリーキャッシュ有効時間: 2592000秒(30日間)
  • キャッシュクリアの対象ブログ: サイト構成に沿って適切に設定
  • クライアントキャッシュ設定: 120秒

キャッシュドライバー

a-blog cms ではページキャッシュ、テンプレートキャッシュなどの複数のキャッシュが利用できますが、さらにキャッシュする場所や方式(ドライバー)も設定できます。

キャッシュドライバー

複数のキャッシュドライバーを用意しています。

ファイル キャッシュドライバー

ローカルのファイルシステムでファイルとしてキャッシュを行います。
他のAPCuやRedisなどのインメモリキャッシュに比べると低速になります。

PHPファイル キャッシュドライバー

PHPファイルとしてキャッシュします。OPcacheが有効だと高速に動作します。

メモリー キャッシュドライバー

メモリキャッシュになります。共有メモリではないので、アクセスの間だけ共有されます。

APCu キャッシュドライバー

APCu 拡張モジュールを使った、高性能な共有メモリキャッシュです。共有メモリに保存されるため、アプリケーションの性能を大幅に向上させることができます。

Redis キャッシュドライバー

Redis サーバーを使った 共有メモリキャッシュです。アプリケーションの性能を大幅に向上させることができます。

設定変更方法

a-blog cms 設置ディレクトリに、.env ファイルを用意する必要があります。最初のパッケージに、env.txt ファイルがありますので、これを「.env」ファイルにリネームしてご利用ください。

ドライバーの変更

CACHE_xxxxxxx_DRIVER の値を変更することで、各キャッシュのキャッシュドライバーを変更することができます。
変更できる値は以下のものになっております。

  • file: ファイル キャッシュドライバー
  • php: PHPファイル キャッシュドライバー
  • memory: メモリー キャッシュドライバー
  • apcu: APCuキャッシュドライバー
  • redis: Redis キャッシュドライバー

CACHE_xxxxxxx_DRIVER には複数の値を「パイプ(|)」でつなげて設定することが出来ます。複数の値を設定した場合は、右から優先して利用できるドライバーがあったら、そのキャッシュドライバーを利用します。 CACHE_TEMPLATE_DRIVER=apcu|file この場合、テンプレートキャッシュで、APCuが利用できる環境だとAPCuキャッシュを使用して、利用できない環境だとファイルキャッシュを使用します。

# セッション
SESSION_COOKIE_LIFETIME=2592000 # セッションのCookie有効期限

# キャッシュ設定
# Supported: apcu, php, memory, file, redis

# テンプレートのキャッシュをするドライバーを選択します
CACHE_TEMPLATE_DRIVER=apcu|file
CACHE_TEMPLATE_NAMESPACE=template
CACHE_TEMPLATE_LIFETIME=2678400

# フィールド情報のキャッシュをするドライバーを選択します
CACHE_FIELD_DRIVER=apcu|file
CACHE_FIELD_NAMESPACE=field
CACHE_FIELD_LIFETIME=86400

# 一時キャッシュで利用するドライバーを選択します
CACHE_TEMP_DRIVER=apcu
CACHE_TEMP_NAMESPACE=temp
CACHE_TEMP_LIFETIME=10800

# コンフィグのキャッシュをするドライバーを選択します
# ページキャッシュに指定できるドライバーは、file または redis のみとなります。
CACHE_CONFIG_DRIVER=file
CACHE_CONFIG_NAMESPACE=config
CACHE_CONFIG_LIFETIME=2678400

# ページキャッシュをするドライバーを選択します
# ページキャッシュに指定できるドライバーは、file または redis のみとなります。
CACHE_PAGE_DRIVER=file
CACHE_PAGE_NAMESPACE=page

# redisのコネクション設定をします
CACHE_REDIS_HOST=
CACHE_REDIS_PASSWORD=
CACHE_REDIS_PORT=6379

Redis を利用するには、Redisサーバーの情報を設定する必要があります。
また、PHPの拡張モジュールとしてRedisが入っている必要があります。

CACHE_REDIS_HOST=
CACHE_REDIS_PASSWORD=
CACHE_REDIS_PORT=6379