【WordPress】Xserver でプラグインなしで APCu を使う方法

最終更新日: 公開日: 2023年03月

永続オブジェクトキャッシュの設定をすると記事を投稿,更新した際にキャッシュをクリアしないとプレビューなどの反映までに時間がかかる状態になっていた.

毎回クリアするというのでは使いにくいので何か良い方法はないかと思っていたところに,前に紹介した「W3 Total Cache」で「赤いお知らせ?」が出てきて,やっぱり邪魔なのでプラグインを使わない方法を探ることにした.

ちなみにこの方法だと1度見に行くとキャッシュがかかってクエリーの実行がほぼ0になるので文字通り,爆速となる.

object-cache.php

探し始めたところ,すぐに見つかった.(感謝)

これを読めばプラグインを使わずとも行けることが分かったので,ちょっと改造することにした.

https://downloads.wordpress.org/plugin/apcu.1.0.2.zip

をダウンロードしてきて,中にある object-cache.php というファイルを wp-content の直下に置くだけだ.
実際,W3 Total Cache を入れていた時もこの object-cache.php というファイルは出来ていたのでオブジェクトキャッシュを使うときはこのファイルが必要らしい.

(2023/3/2)「WordPressでAPCuを使う」というページを見つけた.

その内容を参考に object-cache.php の先頭にいれるコードは以下のように変更した.

!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 のサーバーに置いても動くようにバックスラッシュをスラッシュに変換している.

キャッシュ全体の削除方法

しかし,ここまでだとキャッシュのクリアの方法に困る.そこで探してみると,

というプラグインが見つかったので,このプログラムの中身を確認してみる.
キャッシュをクリアしているところはすぐに見つかる.
そのまま拝借(感謝)してきて,以下のように functions.php に追記する.
まあ,apcu_clear_cache という関数があれば,それを使い,なければ,apc_clear_cache を使う.なければ諦めるということ.

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');

これで記事を「保存」したときに毎回,キャッシュをクリアしてくれるので記事がすぐに反映される.
(ただ,全部消えてしまうのでイマイチといえばイマイチ.本当は記事単位でキャッシュを消したい.)

記事そのもののキャッシュの削除方法

(2023/3/3)
その後,object-cache.php を見ていたら記事だけ消すことが出来たのでその方法も書いておく.
これだと記事しか消さないのでタグとか他のあらゆる情報は消されないことに注意.(実際に確認してみると,ほとんど何でもキャッシュされてしまう.)

function my_save_post($post_ID) {
  if (function_exists('apcu_delete')) {
    global $table_prefix;
    $key = DB_HOST.'.'.DB_NAME.'.'.$table_prefix . '.posts.' . strval($post_ID);
    apcu_delete($key);
  }
}
add_action('save_post', 'my_save_post');

これなら記事を編集した際にその記事のキャッシュだけが消えて他の記事などのキャッシュは消えないので高速化が保たれたままになる.
しかし,投稿記事そのものしか消さないので何か問題があっても知りません.自己責任で使ってください.

エックスサーバーの高速化の設定を変更

しかし,Xserver で高速化の設定をしている場合,このままでは記事を保存しても,すぐに反映されないので困る.
使いにくいので,どういう状態だと「下書き保存」しても問題なく更新されるのかを確認した.

結果としては以下の設定にしておけば「永続オブジェクトキャッシュ」の設定をしている状態でも更新が反映されるようになった.

Xアクセラレータ設定
Xアクセラレータ Ver.1
サーバーキャッシュ
ON
ブラウザキャッシュ
ON[全ての静的ファイル]

Xアクセラレータ Ver.2 を使うと APCu のキャッシュをクリアしてもすぐには反映されないようだ.

動いているのかの確認

動作確認は「永続オブジェクト」の警告が消えれば,とりあえずは動いているんだなというのは分かる.
キャッシュってどれくらい効いているのだろう?

いろいろ検索しているとそれを確認するツールを紹介しているところがあった.

APCu (※先ほどの参照サイトで紹介されていた)

ここの apc.php をダウンロードしてきて,ウェブサーバーの適当な場所に置く.

ちなみにエックスサーバーでは APCu と OPcache が有効らしい.

OPcache も何かないかと探してみると以下のページが見つかった.

OPcache (※PHP7.4でAPCuとOPcacheをインストールする方法 (感謝))

こちらも同様にダウンロードしてきて,ウェブサーバーの適当な場所に置く.
 

Contact

ご質問等ありましたら,お手数ですが弊社の個人情報保護方針をお読み頂いた上でフォームからお願い致します.
※このページと無関係な内容のセールスはご遠慮ください.

 
   
contact
Pagetop