WordPressに永続的オブジェクトキャッシュを追加してみた

前回AWS Lightsailのインスタンスサイズを変えてみたでインスタンスサイズをスケールアップした後。

ふとサイトヘルスを確認したところ、「永続的オブジェクトキャッシュを使用してください」とエラーが。
(色々調べてたらいつの間にかエラーが消えてしまったので画面スクショできず。。。)

色々調べてみつつ、対処してみたのでまとめておく。

永続的オブジェクトキャッシュって何?

エラーを見ても「これ何言ってんの?」としかならなかったのでとりあえず調べてみたw

まず「オブジェクトキャッシュ」について。
簡単に言うと、「DB負荷削減のためにDBの情報をメモリ上にキャッシュしておく仕組み」のこと。

ユーザがWordpressにアクセスすると、必要なデータを都度DBから取得し、ページ生成が完了したらユーザに応答を返す。
この時、メモリ上にはDBから取得した情報が一時的にキャッシュされる。同一ページの処理中は保持され、必要に応じて(DBには問い合わせずにキャッシュ上のデータが)再利用される。
これがオブジェクトキャッシュ、という仕組み。

WordPressにはオブジェクトキャッシュ自体は標準で実装されている。
ただし、1回のページ表示が完了する毎にキャッシュは全て破棄されてしまう。
そのため、これを非永続オブジェクトキャッシュと言う、らしい。

一方で、永続的オブジェクトキャッシュとは、その名の通り永続的にキャッシュする。
初回アクセス時にDBから値を取得してレスポンスを返す、ところまでは非永続と同じ。
違うのはページ表示処理が完了してもキャッシュは削除されず、次回以降の同一ページへのアクセスがあればDBへは問い合わせずにキャッシュを再利用してレスポンスが返されるところ。

Geminiに書かせてみた。正確性は保証できないのでなんとなくのイメージで見てもらえると。。。

結局実装した方が良いの?

サイトヘルスに出てきた以上実装した方がいいんだろうなと思いつつ調べてみたら、どうやらそうでもないらしいw

少なくとも個人ブログのようなアクセス数が多くないようなサイトの場合は気にしなくていい、って言ってる人が殆どな印象。
何ならサイトヘルスの画面に出てこないようにConfを弄る方法まで出てきたw

今は一旦エラーも落ち着いている=サイトヘルスには出てないのでやらなくてもいいかなとか思ったものの。調べたところ、このエラーは投稿数が増えてくると出てくるようになるとのことで。

結局いつかは何かしらの対処をすることになるんだろうな、ということで今のうちに対処することにした。
(サイトヘルスに残り続けるのはそれはそれで気になるのでw)

対処方法の検討

案1:functions.phpでサイトヘルスの警告だけ消す
 → まあこれでも良いが…せっかくの技術ブログなのでもうちょっと踏み込んだ対処をしてみたい。
   というわけで却下。

案2:APCuを導入する
 → PHPの共有メモリを利用するキャッシュ。
   常駐デーモンが要らないためメモリ消費量が少ないが、Webサーバの再起動で
   キャッシュが全消去されるのが特徴。

案3:Redisを導入する
 → 独立した常駐型インメモリキャッシュ。
   独立しているためWebサーバの再起動に影響されないが、常駐デーモンが要るため
   メモリ消費量が増えるのが特徴。

AWS Lightsailの場合、プラグインの更新などでWebサーバの再起動が走りやすいため、
再起動に影響されないRedisの方がおすすめ(by Gemini)とのことなので、案3を採用する。

Redisの導入手順

1.インスタンスへRedisのインストールと起動

LightsailインスタンスへSSHして関連パッケージのインストールを実施
 ※ php8.3-redisについては導入しているphpバージョンに準じて適宜変更(以下同じ)

redisの起動と永続化設定を実施

redisの起動確認

インストールしたphp-redisを有効化
 ※ 特に何もエラー返ってこなければOK

WebサーバとPHPの再起動

2.Redis Object Cacheプラグインの導入

Redis Object Cacheプラグインをインストールして有効化する。

プラグインの設定画面を開いて、OverViewタブのFilesystem/Redis欄が緑チェック(Writeable/Reachable)になっていることを確認してから、「Enable Object Cache」をクリック

Status欄が「Connected」に、Client欄が「PhpRedis」になっていれば導入完了

3.サイトヘルスの状態確認

ここまでやってサイトヘルス的にはどうなったかを確認してみたら、
無事に「永続オブジェクトキャッシュを使用中です」に変わっていたのでWordpress的にも正常に認識されていそう。

これで対応完了!

ちなみにRedisのデメリットに消費メモリ量が増えるという点を挙げたが、
実際にこれでどれくらい消費メモリが増えるかは今後の状況を見て、って感じ。
あんまりメモリ食うようなら無効化を検討しますw

(補足)キャッシュの手動クリア方法について

Redis Object Cacheプラグインの場合、プラグインや記事の更新を行ったときは自動的にキャッシュがクリアされるため、手動でキャッシュクリアをする必要はあんまりないはず。

ただ場合(変更箇所)によっては上手く自動クリアしてくれない可能性があるとのことで。
手動でキャッシュクリアをしたいときはプラグインの設定画面からOverviewの下部にある「Flush Cache」をクリックすれば良いとのこと。参考までに。


ということで今回はここまで。
上には書かなかったけどPhpRedisの導入方法が分かるまでが大変だった。。。
Geminiの指示に従ってwp-config.php弄ったらブログにアクセスできなくなったりとかww
(閲覧中だった方いたらすみません…作業起因ですw)

次回当たりでCloudWatchエージェントを入れておきたいかな。。。
(今後のリソース消費量の推移を記録しておきたい)