Redis または Memcached でオブジェクトキャッシュを設定する
まず: PHP には何ができるか?
オブジェクトキャッシュは Redis または Memcached と通信するため、PHP には対応する拡張モジュールが必要です。Kakapo は実行時に、クラス Redis あるいは Memcached が本当に読み込まれているかを見て確認します。Redis のサービスが動いているだけでは足りません。拡張モジュールがなければ、PHP はそれと話せないからです。拡張モジュールがない場合、選択リストのその項目は無効になり、隣にどのパッケージが足りないかが表示されます(例えば「pecl install redis」、あるいはディストリビューションのパッケージ php<version>-redis、その後 PHP を再起動)。d の付かない古い拡張モジュール「memcache」しか見つからない場合、Kakapo はそれをはっきり伝えます — 一括取得の getMulti とバイナリ転送がないため、こちらは使いません。どちらの拡張モジュールもなければ、ここから先へは進めません。これはプラグインではなく、ホスティング事業者の領分です。
接続情報を入力
ホストは通常 127.0.0.1 です。「http://」のようなスキームは拒否されます。ここに入るのはホスト名か IP アドレスだけだからです。Unix ソケットを使う場合は、その経路を入力し(例: /var/run/redis/redis.sock)、ポートを 0 に設定します。ポートは Redis では通常 6379、Memcached では 11211 で、0 から 65535 まで指定できます。接続先を切り替えると、それまでの値が既定のままであるかぎり、Kakapo は既定のポートも自動的に合わせます。データベース番号(0 から 255)は Redis にのみあり、このサイトを同じサーバー上の他のアプリケーションと分けます。ユーザーとパスワードが必要なのは、Redis が ACL を使っている場合(Redis 6 以降)か、Memcached が SASL を要求する場合だけです。キーの接頭辞は、同じキャッシュサーバー上にある 2 つの WordPress インストールを互いに分けます — この欄を空のままにすると、サイトのアドレスから接頭辞が導き出されます(kwpp と 8 文字)。使えるのは英字、数字、および _ . : - で、最大 40 文字です。エントリーごとの有効期間は初期値が 86400 秒で、0 から 2592000 まで指定できます。0 は「期限切れにならない」という意味です — これはクリアの動作に影響します。下記を参照してください。
何かを書き込む前に接続をテストする
「接続をテスト」ボタンは実際に接続を確立し、テスト用のキーを書き込み(有効期間 30 秒)、それを読み戻し、書き込んだ値と 1 文字ずつ比べたうえで、再び削除します。値が変わらずに戻ってきて初めて、テストは合格とみなされます。単に「connect() が false を返さなかった」だけでは根拠が薄いからです。Redis は接続できていても書き込み禁止(レプリカ)であることがありますし、Memcached はメモリを確保する前から接続を受け付けます。この一連の流れ全体には 1 秒の制限時間があります。測定された所要時間といくつかのサーバー情報(バージョン、使用メモリ、エントリー数、実行時間)は、その後カードに表示されます。テストが失敗した場合は、具体的な理由が表示されます。到達できない、認証が拒否された、データベースを選択できない、といった内容です。テストが動くのは管理画面の中か Cron 経由だけです。訪問者のページ構築中にテスト接続が張られることは決してありません。
ドロップインを書き込む — そのとき何が起きるか
オブジェクトキャッシュは wp-content/object-cache.php というファイルの中にあります。WordPress はこれを非常に早い段階、どのプラグインよりも前に読み込みます。書き込む前に Kakapo はプレビューを表示します。どのファイルが作られるか、その中にどの接続情報が書かれるか、そのあとキャッシュサーバーに何が置かれるか、そして元に戻す道筋はどうなるか、です。何かが妨げになっている場合 — 拡張モジュールがない、この場所に別のドロップインがある、wp-content に書き込めない、テンプレートがない — ボタンは無効になり、その理由が上に表示されます。このチェックは書き込みの際にサーバー側でもう一度行われます。確認のために INSTALLIEREN と入力します。書き込みはまず隣のファイルに対して行われ、そのファイルは PHP 自身によって構文がチェックされます(exec() が許可され、PHP のバイナリに到達できる場合)。そのうえで初めて所定の位置に名前を変えて移され、権限が 0644 に設定されます。この回り道をする理由は、書きかけの object-cache.php がどのプラグインよりも前に起きるエラーになるからです。サイトは真っ白になり、それを取り消すための管理画面まで真っ白になってしまいます。さらに、書き込みのたびに独自の世代番号が付きます。削除より前の時期のエントリーが突然また有効になることを防ぐためです(そうしないと、例えば古いブログ名が戻ってきたり、ログイン済みの管理者がセッションから追い出されたりします)。その場所にすでに別のドロップインがある場合、それが上書きされることも削除されることもありません。
運用中: 数値を見る、クリアする、削除する
「稼働状況」には、この 1 回のページ表示に関する数値が並びます。接続の確立にかかったミリ秒、ヒットとミス、そのうち何件がキャッシュサーバーから来たか、そこへ何件の問い合わせが行き、どれだけ時間がかかったか、です。時間経過の統計は意図的に用意していません。それを取ると、測る対象より多くのコストが呼び出しのたびにかかってしまうからです。「オブジェクトキャッシュをクリア」は、FLUSHDB や flush_all を送る代わりにキーのソルトを入れ替えます。これにより古いキーはどれも有効なエントリーを指さなくなりますが、同じサーバー上にある他のアプリケーションのデータには手を触れません。取り残されたエントリーは設定した有効期間で期限切れになります。これが 0 の場合は決して期限切れにならず、Redis や Memcached 自身が片付けるまでたまり続けます。設定を変更しても、有効なのは引き続きファイルに書かれている内容です。Kakapo はその食い違いを知らせ、「ドロップインを更新」を提案します。「ドロップインを削除」はファイルをちょうど 1 つ削除するだけで、データベースの行もスケジュールも残しません。プラグインを無効にしたときにも同じように消えます。パスワードをファイルの中に平文で置きたくない場合は、wp-config.php で KWPP_OC_AUTH として定義し、入力欄を空のままにします — 定数が優先されます。同じことがホスト、ポート、ユーザー、データベース、接頭辞についてもできます(KWPP_OC_HOST、KWPP_OC_PORT、KWPP_OC_USER、KWPP_OC_DB、KWPP_OC_PREFIX)。そうすればサーバーを移してもドロップインを書き直す必要はありません。