[WordPress] APCu オブジェクトキャッシュで高速化

高速化プラグインはいろいろありますが、オブジェクトキャッシュに特化したシンプルな APCu Object Cache Backend あるいはプラグイン APCu Manager を使います。

オブジェクトキャッシュで高速化

Xserver では オブジェクトキャッシュの APCu という仕組みを利用できるそうなので、利用するために APCu Object Cache Backend をダウンロードして少しだけ改変して wp-content 内に置きました。結果、高速化半端なし。ただしちょっと使うのにコツが必要でした。

そして時が経ち、プラグイン APCu Manager が良い感じに動いてくれるようになったので切り替えました。

そしてさらに時は流れ、プラグイン APCu Manager は最初出会った頃と同じような酷いことになったので、再び自家製のAPCu Object Cache Backendに戻りました。

さらにさらに時が流れ、APCu Manager が更新され「バグ直ったよ」とのことですが、もう面倒くさくなったのでプラグインに戻らず、自家製のまま乗り切っております。

以上から判るとおり、この投稿は時の流れに翻弄されたので、少しまとめ直しておきます。

まず APCu オブジェクトキャッシュを使用する方法です。

  1. APCu Object Cache Backend というものを使って半自家製で行うやりかた
  2. プラグイン APCu Manager のお世話になるやりかた

この二つです。

1 APCu Object Cache Backend を使用するケース

この件について私が何か知見を持っているかというと 0 で、何の知識もありません。巻末にそれについて少し触れましたが、これが何なのかも含めて、よくわかっていません。

この件では、ふたりの先生にお世話になりました。

WordPressでAPCuオブジェクトキャッシュを使う -フリースタイル

【WordPress】Xserver でプラグインなしで APCu を使う方法 -株式会社レクタス

まず最初の基本。WordPressでAPCuオブジェクトキャッシュを使う -フリースタイル ←このページで知り、教えの通りのことをしたまでです。

https://downloads.wordpress.org/plugin/apcu.1.0.2.zip というものをダウンロードして、ちょっとだけ改造して使用します。

  1. ファイルをダウンロード
    https://downloads.wordpress.org/plugin/apcu.1.0.2.zip
  2. ダウンロードしてきたファイルのobject-cache.phpを編集

    // こちらを先頭に追記 管理画面では使用しないようにするため
    if ( is_admin() ) { return false; }

  3. wp-contentディレクトリに編集したobject-cache.phpをアップロード

以上でオブジェクトキャッシュが有効になります。

WordPressでAPCuオブジェクトキャッシュを使う -フリースタイル

詳しくはリンク先の記事をお読みください。

ダウンロードした object-cache.php をエディタで開いて一番上に指定の一文を追加します。

if ( is_admin() ) { return false; }

admin では何もせずに終了せよという一文ですね。

これでも良いのですが、後に別の方が書かれていた別の一文もあります。

【WordPress】Xserver でプラグインなしで APCu を使う方法 -株式会社レクタス ← この先生は先頭に入れるコードをもう少し凝ったものにされています。

!defined( 'ABSPATH' ) and exit;
if (!function_exists('apcu_fetch')) {
return false;
}
$arrABS = explode('/', str_replace('\\', '/', ABSPATH));
if (is_admin() && !($_SERVER["SCRIPT_NAME"] == "/" . $arrABS[count($arrABS) - 2] . "/wp-admin/site-health.php")) {return false;}

一つ目は直接のアクセスを防ぐもの.
二つ目は APCu が使えないサーバーでもエラーになることはないので入れておく.(テスト用のローカルサーバーでも同一ファイルを使えるようにするため)
三つ目は管理画面ではキャッシュを効かないようにしつつ,サイトヘルスステータス画面で「永続オブジェクトキャッシュ」の警告を表示させないため.
文字列置換しているのは Windows のサーバーに置いても動くようにバックスラッシュをスラッシュに変換している.

こうして保存した object-cache.php を wp-content フォルダに入れると有効になります。

管理画面の「プラグイン」を見ると、通常のプラグインと異なり「ドロップイン」のところに鎮座していることが確認できます。

キャッシュクリア – APC Clear Cache

APCu Object Cache Backend を入れるとオブジェクトキャッシュが効きすぎて、更新作業を行っても反映されません。キャッシュをクリアする必要があります。私が試して効果が確認できたのはプラグイン APC Clear Cache でした。

APC Clear Cache は、ダッシュボードの「ツール」から設定画面に行ってクリアボタンをクリックしなければなりません。わりと頻繁にクリアの必要があるので、 APC Clear Cache ページをブックマークしてアクセスしやすい場所に置いておくといい案配です。

後に、PHP の関数 apcu_clear_cache() が効くとわかったので、簡単なphpファイルを一個作って、そっちを使うようになりました。

<!DOCTYPE html>
 <html lang="ja">
 <head>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 <meta name="robots" content="noindex,nofollow">
 <title>Clear APCu cache</title>
 <style> body{font-family: sans-serif } </style>
 </head>
 <body>
 <?php apcu_clear_cache();?>
 <p>APCu cache cleared.</p>
 </body>
 </html>

これをブックマークしておいて開くだけでクリアできます。これも悪くないがまだ使い勝手が悪い。勝手に消してくれないものかと思っていると、先ほどの先生がそれについても言及されていました。https://www.rectus.co.jp/archives/14322

function my_save_post($post) {
  if (function_exists('apcu_clear_cache')) {
    apcu_clear_cache();
  } else if (function_exists('apc_clear_cache')) {
    apc_clear_cache();
  }
}
add_action('save_post', 'my_save_post');

これを functions.php に書くなり、スニペットとして保存するなりします。

当方ではapcu_clear_cache()が問題なく動くので上記の分岐が必要なく、単にこうしました。

function my_save_post($post) {
  apcu_clear_cache();
}
add_action('save_post', 'my_save_post');

これでポストを保存するたびにキャッシュがクリアされるようになりました。が、まだ不満です。

簡単なPHPファイルをブラウザで開くことについて上で書きましたが、後に、もっと簡単で気軽なやり方に落ち着きました。

超簡単操作のAPCu キャッシュクリア【WordPress】

超簡単操作のAPCu キャッシュクリア【WordPress】

2 プラグイン APCu Manager を使用するケース

プラグイン APCu Manager です。WordPress の新規プラグインから検索で出てきます。

このプラグイン、最初に試したときはサイトが無茶苦茶遅くなったので即座に消去して悪い印象しかありませんでした。が、人もプラグインも成長します。久しぶりにインストールしてみたら今度は調子良く動いています。こっちはキャッシュが効き過ぎるということもなく、余計なコツもいりません。キャッシュの手動消去もまあまあ気軽にできます。

それで、一時期はこのプラグインに乗り換えていました。

それから時が流れ、アップデートでチョンボをやらかした後、また以前のようにクソ重くなることが頻発しました。

なので、再び使用停止にし、自家製のAPCu Object Cache Backendに舞い戻りました。

修正されたよと言いながらちっとも修正されていない更新が続いたこのプラグイン、最近また「バグ直ったよ」と更新されていましたが、もう試していません。治ったのかもしれないので、プラグインで楽するほうが良いの。と、思われてる方は試してみてはいかがでしょう。

意外とちゃんと動かないAPCuプラグイン

APCu キャッシュやクリアするプラグインは、WordPressの「新規プラグイン」で検索するといろいろ出てきますが、試しても動作が安定するものが少なかったです。APCu Manager にしても、最初インストールしたときはサイト全体が怯むほど遅くなってビビりました。

やがて直りましたが症状が再発、またもや酷い有様となりました。

はっきり言いますと、サーバーとかキャッシュとかわけ分からなくて私なんかの手に負えません。細かな相性、細かなバージョン、サーバーの対応、ちょっとしたことで状況が変わります。ここを読んでくれてるみんなも、ネット情報を鵜呑みにせず、また、一度目の結論をいつまでも引き摺らず、こまめなテストと運で乗り切りましょう。

以上、時の流れと共に追記したりごちゃごちゃしていたので整理しました。

Digital Boo Pennguin Icon 以降はこの投稿公開当時に書いていたオマケの御託ですので、読んでも読まなくてもどっちでも。

オブジェクトキャッシュ

Query Monitor 警告

WordPress で Query Monitor プラグインを利用していると、ときどき「遅いクエリ」という警告が出てきて「あなたの環境で APCu が利用できるからオブジェクトキャッシュを使えばいいよ」みたいなことを言われます。何のことやらわかりませんが、親切にも、WordPress の新規プラグイン画面で検索窓に「APCu」と入力までしてくれて、それで「APCu はオブジェクトキャッシュが使える仕組みのようなものだな」と理解出来ました。

wp 6.1

WordPressのバージョン 6.1 以降、サイトヘルスが同様の警告をしてくるようになったそうです。「永続オブジェクトキャッシュを使用してください」とか何とか言ってくるとか。

懐かしのオブジェクトキャッシュ

以前、オブジェクトキャッシュだけを行うプラグインを使っていましたが、いつしか消え去りました。確かに、あの頃オブジェクトキャッシュはよく効いた。今でもそれは変わらないのですね。良く効いたけれども、トラブルの原因ナンバーワンでもありました。それはともかく。

Xserver ではサーバー側で機能するオブジェクトキャッシュの機能が備わっていて、APC と OPcache が使えるという。
APC/OPcacheについて – xerver に説明があります。

機能は備わってはいますが、実際に利用するには明示的に使用することを命じる必要があるとのことです。もちろん素人には命じることなどできません。

キャッシュプラグイン

そこでWordPressのプラグインを探します。Query Monitor が教えてくださった「APCu」での検索により、いくつかのプラグインがヒットしました。

見つめていても仕方がないので、オブジェクトキャッシュに特化したように思えるプラグインをいくつかインストールして試しました。

一般的に、統合型の大型キャッシュプラグインをお勧めされることが多いのですが、私は統合型の大型キャッシュプラグインというものが嫌いで、というのも、以前痛い目に遭っているからです。非力な共用型レンタルサーバーで使用すると大抵逆効果、より遅くなることのほうが多いです。設定もごちゃごちゃしていて鬱陶しいし。

ということで以下、いくつかプラグインを試しては悪態をついていましたが、一つを残し削除しておきました。

APCu Manager

APCオブジェクトキャッシュだけをオンにしたいのだ、と、次に試してみたのは APCu Manager というプラグイン。完全にAPCuに特化しているようなので期待しました。

結果、のけぞるレベルで遅くなりました。ページは現れないわ、現れてもクリックに反応するまでに数秒かかるわ反応してから表示されるまで十数秒かかるわで、いったい何が起きたのかというレベルで使い物にならぬ低速化に見舞われました。こちらも相当に相性が悪いようでした。

という感じで、APCu検索で出てくる公式公認のプラグインはどれもこれも壊滅状態で、ぜんぜん駄目、何もしないほうがましでした。例に挙げたプラグインを悪く言うつもりはございません。サーバー、WPバージョン、プラグイン、その他その他、何かしら相性が悪かっただけだと思います。

↑ と、書いていたわけですが、ある頃を境に APCu Manager 快適になりました。何が起きたのでしょう。

コンマ1で世界が変わる、付き合いきれない世界がそこにあります。

と、書いて数年後のこの行ですが、またまた再発しました。何かの拍子に、遅すぎて使い物にならなくなります。コンマ1で世界が変わります。ほんとに。

APCu Object Cache Backend はどうなった?

オブジェクトキャッシュのプラグインは動く根っこが深いといいますか別次元ぽいので、プラグインフォルダ内で事が済まず、content フォルダ内にファイルが置かれます。

object-cache.php

APCu Object Cache Backend  も object-cache.php、APCu Manager をインストールしても object-cache.php です。

APCu Object Cache Backend を使っているのに APCu Manager をインストールして、最初は共存しているのかと思いましたが、contentフォルダ内の object-cache.php が入れ替わっただけのようでした。

付録

APCu Object Cache Backend の謎

APCu Object Cache Backend について、腑に落ちない点があります。

これは一体何だろう、とURLを確認したら、https://downloads.wordpress.org/plugin/apcu.1.0.2.zip で、普通にWordPressのプラグインじゃん。とわかります。プラグインページを見てみました。すると…

apcu
APCu Object Cache Backend プラグインページ

「このプラグインは2019年9月7日に終了しておりダウンロードできません。この閉鎖は恒久的です」となっておりますよ。

参考にした先生のページは2021年に書かれていて、プラグイン配布停止後です。さらに、ダウンロードしたのは最終バージョン2.0.0ではなく 1.0.2 です。これはいったい、どういうことでしょうか。

(ここでいろいろ検索して読んでみた形跡)

いろいろ読んでみてわかってことは、さっぱりわからないということでした。APCu Object Cache Backend はプラグインとしては終わっていますが、根幹の部分だけちょっと変えれば使えるということでしょうか。だからキャシュクリアができないんでしょうか。理解なきままですが、よしとしておきます。

キャッシュクリア

APCu Manager ではキャッシュの消去も機能の中にありますので関係ありませんが、APCu Object Cache Backend を使うならキャッシュを消去する機能を追加する必要があります。

APC Clear Cache

プラグイン「APC Clear Cache」は「ツール」の設定画面に Clear ボタンがあるだけ。シンプル。キャッシュを消します。動きはパーフェクト。最終更新が2年前でも気にしない。

The Cache Purger

人間、贅沢にはすぐに慣れるもので、APC Clear Cache はとても良いのですが、ダッシュボードのツールからボタンに辿り着くのがとても面倒に思えてきます。もっと手早くクリア出来ないものかと少々探りましたら、 The Cache Purger なるプラグインがありました。

オブジェクトキャッシュのみならず、主なキャッシュプラグインが作るキャッシュをまとめてパージするという 乱暴者 優れものです。admin bar にもクリアのメニューが付き、アクセスも簡単。これはいいかも。

と、思ったのもつかの間、ぜんぜん消えてくれないです。これ、駄目でした。

PHP

ところで、PHPの関数に apcu_clear_cache() というのがあります。APCuキャッシュをクリアする関数だそうです。→ apcu_clear_cache

apcu_clear_cache()

これだけで良いようですが、これって、どうなんでしょう。ちょっと試しました。

body に<?php apcu_clear_cache() ;?>  だけを書いたHTML書式のphpファイルを作って置いてみたんです。ブックマークして、このページにアクセスするだけでキャッシュがクリアされると期待してテスト。

クリアされたようです。キャッシュクリアだけのプラグインは不要かもしれないですね。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="noindex,nofollow">
<title>Clear APCu cache</title>
<style>
body{font-family: sans-serif }
</style>
</head>
<body>
<?php apcu_clear_cache();?>
<p>APCu cache cleared.</p>
</body>
</html>

というわけで、オブジェクトキャッシュの二つの方法、APCu Object Cache Backend を改編した自家製プラグインとキャッシュ消去PHPのセット、それとプラグイン APCu Manager でした。

APCu Manager は3.5あたりからすこぶる快適でしたが、3.8.x 3.9.0 でやらかしてしまい、WordPressのサイトを最悪の激遅に陥れます。でもまた直してくるかもしれない。プラグインは気軽なので治ったらまた使用を考えますが、どうかなあ。

APCu Object Cache Backend を改造した自家製プラグインは、キャッシュ消去の仕組みを追加するのが面倒だけど、プラグインみたいに負担もなくて快調です。

様子をみましょう。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください