WordPress で Redisを使う

「永続オブジェクトキャッシュを使用してください。」

このサイトのWordPressのサイトヘルスに「永続オブジェクトキャッシュを使用してください。」と表示されるようになったのが6.1頃とのこと。 これが2022年11月。

しばらく放っておいたのだが、これに対応させるためにW3 Total Cacheなどをインストールしたのだと思う(うろ覚え)。

このメッセージは消すことはできるようだが、まずは真面目に対応することを考えてみた。

今回はRedisを使うことにした。

永続オブジェクトキャッシュとは

WordPressキャッシュを徹底解説| Kinsta®から引用する:

オブジェクトキャッシュは、データベースクエリの結果を保存し、次回のアクセス時にその特定のデータが必要になった際、データベースに問い合わせることなく配信できるようにするものです。これによって、PHPの実行時間が短縮され、WordPressのデータベースへの負荷が軽減されます。

WordPressには、オブジェクトキャッシュ(WP_Object_Cache)が組み込まれていますが、1回分の読み込み用のオブジェクトしか保存されません。キャッシュの目的は、ページ読み込みの間に、同じ目的で何度もデータベースが照会されないようにすること。しかし、WordPressでキャッシュされたオブジェクトは、1回読み込まれると、使用されなくなります。WordPressのオブジェクトキャッシュは便利な機能ですが、複数回使用できないのが難点です。

WordPress組み込みのオブジェクトキャッシュを外部ソリューションに切り替えれば、/wp-content/ディレクトリにキャッシュスクリプトをドロップすることで、複数のページ読み込みでキャッシュを再利用することができます。例えば、W3 Total Cache のようなプラグインベースのオブジェクトキャッシュ機能を使用できます。

データベースへのクエリの結果を再利用できるような仕組みのことを指すと理解した。

redisのビルド

さくらレンタルサーバでredis #Redis – Qiitaを参考にビルドした。

$ wget https://download.redis.io/redis-stable.tar.gz
$ tar xvf redis-stable.tar.gz
$ cd redis-stable/src

src/Makefile を編集

~/.local/以下にインストールする場合は以下のようにする:

# PREFIX?=/usr/local
PREFIX?=/home/USER/.local

ビルド

$ gmake
$ gmake install

redis.confの編集

レンタルサーバーなので unix socketで通信させるようにしてみた。

redis.confの設定は【完全版】Redisをただのレンタルサーバー上で安定して使う方法 | Yaseiblogを参考にした。

redis.confを好みの場所にコピーする。自分の場合は~/.local/etc にした。
cp redis.conf ~/.local/etc/

redis.confの編集箇所は以下の部分:

pidfile /home/USER/.local/var/run/redis.pid

port 0
unixsocket /home/USER/.local/var/run/redis.sock
unixsocketperm 700

redis起動コマンドを作る

pidファイルの有無で判定する例があったのだが、これだと上手く再起動しないようだ。 というのも、プロセスが消えてもpidやソケットファイルが残るから。

仕方ないので、psとgrepでredis-serverのプロセスがあるかを判定することにした。 shellスクリプトは Linux上のプロセスを監視して、プロセスがダウンしたら再起動させるShell – KYO’s Techを参考にさせてもらった。

#!/bin/sh

isALIVE=`ps ax | grep "redis-server" | grep -v "grep" | wc -l`
if [ ${isALIVE} -ne 1 ]; then
  nohup /home/USER/.local/bin/redis-server /home/USER/.local/etc/redis.conf &
fi
これを~/bin/redis-run.shとして保存した。

crontabに登録する

15分おきに監視して実行する:

*/15 * * * * /home/USER/bin/redis-run.sh

wp-config.php

socket のpermissionが問題になるかも知れない。

Redis socket “Connection refused” | WordPress.orgが参考になった。

define( 'WP_REDIS_PATH', '/home/USER/.local/var/run/redis.sock' );
define( 'WP_REDIS_SCHEME', 'unix' );

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

の前に挿入する。

Redis Object Cacheをインストールして有効化

プラグインRedis Object Cacheをインストールした。

接続ができているかなどを確認して、object cacheをenbleにする。