WordPress Plugin : YASAKANI Cache

WordPress は、動作が重いのでキャッシュプラグインを使って高速化されている方も多いと思います。定番のプラグインとして WP Super Cache や最近では WP Fastest Cache 等が人気のようです。

これらのプラグインを使えば高速化できるのはわかっているのですが、最近よく使っている SQLite を活用すれば、より簡単で、さらに超高速なキャッシュプラグインが作れると思いチャレンジしてみました

シンプル、簡単、超高速なページキャッシュプラグインができましたので興味ある方は使ってみてください (^^)

 

YASAKANI Cache

目標は WP Super Cache よりも使いやすく、さらに高速なページキャッシュです。けっこういい感じに仕上がったのではないかと自負しています (^^)

ベースにしたのは、以前作成したアクセス集中時用の超シンプルなキャッシュプラグイン

ページキャッシュの仕組みと効果ーアクセス集中時用のプラグインも作ってみました
WordPressのページキャッシュの仕組みと効果を検証しました。また、アクセス集中時の負荷軽減を目的としたシンプルなページキャッシュプラグインも作成してみました (^^)…

※YASAKANI Cache を作る上で、WP Super Cache 及び Simple Cache の2つのキャッシュプラグインはいろいろ参考にさせて頂きました
Simple Cache のコンセプトや Last Modefied の処理はためになりました m(_ _)m

プラグイン名について

WordPressを 1000倍高速にする KUSANAGI というサーバー環境が一部で話題となっていますが、私が利用しているエックスサーバーでは使用できません (>_<)

そこで、KUSANAGIっておそらく三種の神器からきていると思うので、インスパイアされて WordPress の三種の神器プラグインになれるように願いを込めて、八尺瓊勾玉(やさかにのまがたま)から YASAKANI Cache という名前にしました

 

特徴

WordPress の遅い原因というか、ボトルネックは WordPress 自体だったりします。矛盾するようですが、WordPress を起動させないことが一番のボトルネック解消となりますので、キャッシュプラグインでは通常 WordPress のコア機能より前に処理することで 1ms でも速くなるようにしのぎを削り合っています

一方で、定番のキャッシュプラグイン(WP Super Cache, W3 Total Cache, WP Fastest Cache 等)は、多機能ですが設定が複雑でわかりにくかったりということもあるので、もっとシンプルで使いやすいものが求められています

YASAKANI Cacheは、機能をページキャッシュに絞り、SQLiteを利用することで、シンプルで使いやすく超高速なキャッシュプラグインとなっています

SQLite

SQLiteは、パブリックドメインで提供されてる SQL92準拠の豊富な機能を持ったファイルベースのデータベースで、多くのWebサーバーのPHPから標準で利用できるようになっています

SQLite を使い WordPress のコア機能をロードする前、キャッシュプラグインで使われる drop in プラグイン advanced cache で処理をするために高速に処理できます

最小限の PHP処理だけとして処理時間のかかる正規表現の使用を控え、SQLiteの高速性を引き出すことで、Webサーバーによるプロキシーキャッシュに近い速さが期待できます

また、SQLite を使った副産物として、簡易アクセスログ機能を実装することも出来ました
ちょっと負荷が増えて遅くなりますが、将来的にはアクセス解析的な機能に発展させることもできると思っています (^^)

SQLite は、今回のような用途であれば単純なテーブル構成で済みますし、千件程度のデータをインデックスを活用して処理するだけなので遅くなる要素は見当たりません。
また、最近のサーバーでは SSD を記憶装置に使っていることも多いので、SQLite のデータベースファイルに対するデータI/O速度がボトルネックになることも少なく、メモリキャッシュ等と同等の高速な処理が期待できます

APC/APCu 高速モード

Ver0.9.0 でさらに高速化するために SQLiteのクエリーを APC/APCu を使ってメモリにキャッシュするモードを追加しました。(ベータテスト版)

 

効果

それでは実際に YASAKANI Cache の効果を紹介します

実行環境は、エックスサーバーでPHP7を使った場合です

最初に目標としている WP Super Cache でやってみます

wp_super_cache_network

サーバーやネットワーク機器、帯域のスペック等も関係しますので、参考程度に見てもらえばと思うのですが、Waiting時間は 22ms 程度です

ちなみにこのサイトへの Ping を実行してみると 15ms 程度かかっていたので、サーバー設置場所(大阪?)による通信時間やもろもろのオーバーヘッドを 15ms と仮定するとページキャッシュの処理時間は 7ms 程度と思われます

celtislab_ping

次に YASAKANI Cache です

yasakani_cache_network

Waiting時間は 19ms で WP Super Cache より少し速くページキャッシュの処理時間は 4ms 程度と思われます

上記表示では同じブラウザから複数回アクセスしているので、しっかり Last Modefied の処理も効いて 304 が表示されています

※誤差の範囲と思われるかもしれません。実際に測定毎のバラつきもありますが平均してわずかですが高速です

ただ、この比較では、サーバー設置場所までの通信時間があるのでそれほど性能がでません。そこでローカル環境で通信時間等のオーバーヘッドを除いた状態で Apache の ab テストの性能を参考までに比較してみます

標準的な windows ノート(Corei5 ハードディスク)でローカルの xampp 上で PHP5.4 を使い 同時接続数 30 で 300リクエストの ab テストです

WP Super Cache

xampp-abtest-wp-super-cache

私の環境では、リクエスト毎の平均処理時間が 3.698 ms で1秒間に 270 リクエスト処理できました

YASAKANI Cache

Yasakaniキャッシュは、アクセスログを保存する機能がありますので、ログ機能 OFF/ON に分けてテストしてみました

ログOFF
xampp-abtest-yasakani-logoff

リクエスト毎の平均処理時間が 2.375 ms で1秒間に 420 リクエスト処理できました。なかなか良いスコアだと思いませんか? WP Super Cache より1ms程度速くページキャッシュ処理できています。たかが 1ms、されど 1ms です。パーセントでいえば 50%も高速です (^^)

ログON
xampp-abtest-yasakani-logon

リクエスト毎の平均処理時間が 9.968 ms で1秒間に 100 リクエスト処理できました

さすがにログを有効にすると少し遅く、そこそこのスコアしかでませんがアクセスの少なめのサイトならこれでも十分実用的な効果を得られます

XAMPP等を使ったローカル環境で確認する場合の注意

ローカル環境に WordPress を構築してプラグインを試してみる方も多いと思いますが、Windows10 の localhost アクセスが非常に遅いという場合は IPv6 より IPv4 の優先度を高くすることで高速化できる場合があります

詳細は、下記記事をご覧ください

ローカル環境のMySQL接続遅延とWordPressのLANアクセスについてのTips
XAMPP環境でWordPressのプラグインやテーマを作成していて、MySQLの接続が遅いと感じていませんか、LAN内のモバイルデバイスからアクセスして表示確認したいということはありませんか、これらのデバッグ用のTipsを紹介します (^^)…

ちなみに実際のサーバー環境では通信時間のオーバーヘッド分がありますのでもっと低いスコアになってしまいます

エックスサーバーで同じテストをやってみたところ以下のような値でした(参考値)

Yasakani Log OFF 平均処理時間が 24.981 ms 1秒間に 40 リクエスト
Yasakani Log ON 平均処理時間が 35.764 ms 1秒間に 28 リクエスト

通信時間の影響がやはり大きいようです。

ただ、これでも1分間に1000件近いアクセスがあっても短時間なら耐えられそうな気がします

このプラグインだけではブラウザでアクセスしたときに高速化したという実感は少ないかもしれませんし、Google の PageSpeed等のスコアもあまり高くならないかもしれません

さらに高速化して、PageSpeed 等のスコアをアップするには、後述する さらに高速化するには で紹介している方法を併せて試してみてください。特に .htaccess でブラウザーキャッシュを設定すると PageSpeed のスコアが向上すると思います

インストール

公式サイトからダウンロード出来ます

YASAKANI Cache
Simple ! Easy !! Ultra-high-speed !!!. Definitive edition of the page cache.

ダウンロードした zipファイルを プラグインの新規追加画面 プラグインのアップロード からインストールすることが出来ます

または、プラグインの新規追加画面から YASAKANI Cache を検索してインストールすることも出来ます

注意:Ver0.8.1 から更新する時
WPのプラグイン管理ページから更新させると “プラグインの削除に失敗しました” というエラーで更新を失敗する場合があります。申し訳ありませんが、一旦プラグインを削除してから再度、新規にインストールしてください。(失敗した場合はFTPツール等でプラグインディレクトリ下の yasakani-cache フォルダを削除しないと新規にインストールできなくなってしまいます)

 

動作環境

  • PHP の pdo_sqlite モジュールが有効化されている必要があります
  • APC/APCu モジュールが有効ならメモリキャッシュを併用することが出来ます
  • WordPress 4.4 以上
  • Multisiteもサポートしています
  • PHPバージョン 5.3 以上

このプラグインは、自動的に wp-config.php ファイルにキャッシュ処理用のコードを挿入します。また、wp-content フォルダーに advanced-cache.php というファイルを設置してドロップインプラグインとして動作させています。wp-config.php ファイルや wp-content フォルダへ書き込み権限がある必要があります

advanced-cache.php ファイルはドロップインプラグインというもので、wordpress では、この特定のファイルを wordpress のコア機能をロードするより前の最初にロードするようになっています。したがって WP Super Cache 等の他のキャッシュプラグインが既に advanced-cache.php ファイルを生成していると競合してしまいます。

advanced-cache.php ファイルを用いているプラグインは1つだけしか使えないので、後発の YASAKANI Cache プラグインが定番の WP Super Cache に替わって使われるにはかなり高い壁があるということです。

WP Super Cache に挫折したり、まだページキャッシュは使っていないという方がいましたら、ぜひ一度お試しください m(_ _)m

 

使い方

YASAKANI Cache は、使用開始や、使用停止が簡単で手軽に行うことができるシンプルな操作を特徴としています

yasakani設定画面

使用開始

使い始めるのはとても簡単で、キャッシュの有効期間を選択してページキャッシュを有効化するだけです

使用停止

停止するのも簡単で、ページキャッシュを無効化するだけです

キャッシュ有効期間

有効期間は 10分/1時間/4時間/8時間/1日/7日 から選択します

ログ機能を使い、実際にどの程度キャッシュにヒットするか確認しながら調節していただければと思いますが、8時間ぐらいの設定でも十分にページキャッシュの効果を得られると思います

キャッシュ対象

ページキャッシュの対象は、ホーム/フロントページ、固定ページ、投稿ページ、カスタム投稿ページとWPの埋め込みブログカードのみです

WPの埋め込みブログカードというのは、WP4.4 からサポートされた埋め込みコンテントというもので、この機能により記事を紹介された場合に突発的にアクセスが急増する可能性がありますので、キャッシュで対策するか無効化しておくほうが望ましい機能です

詳しくはこのあたりの記事を参照してください

WordPress 4.4 oEmbed 埋め込みカードの仕組みと注意点!!
WordPress 4.4 から追加された oEmbed 埋め込みカード機能の仕組みと使用上の注意点を紹介します。この機能を停止するためのコードも紹介します (^^)

また、ページキャッシュは、wp_is_mobile 関数を用いてモバイルとPCデバイスを分けて管理しています

 

除外ページの設定

キャッシュから除外したいページがある場合は、簡単に個別の編集画面の表示されるメタボックスから設定することが出来ます

yasakani_除外設定1

各ページで除外設定すると設定画面にリストアップされます

yasakani除外ページ設定

除外ページからキャッシュ対象ページに戻すには、設定画面の除外ページのタイトルリストの 削除 リンクをクリックするか、個別の編集画面のメタボックスから解除することが出来ます

 

APC/APCu 高速モード

APC/APCu モジュールが有効ならば、キャッシュストレージを SQLite にするか、SQLite + APC/APCU にするかを選択する項目が表示されます(Ver0.9.0 ベータテスト版)

※APC/APCuを使えばより高速化することが出来ますが、環境によっては少し不安定なところがあるかもしれません

 

その他の除外条件

  • ログインユーザーに対してキャッシュは表示しません
  • 承認待ちのコメントユーザーに対してはキャッシュは表示しません
  • パスワードで保護されたページはキャッシュしません
  • PHPエラー(ワーニング、ノーティス含む)が発生した場合はキャッシュしません

 

キャッシュクリア

記事の編集や削除に対しては自動的に該当するキャッシュをクリアしますが、プラグインやウィジェット等の設定変更時は、忘れずにキャッシュクリアボタンをクリックして下さい

※個別ページのキャッシュクリアは編集画面の表示されるメタボックスから 除外する を設定してから キャッシュ対象に含める を設定しなおすことでもクリアできます

 

ログ機能

キャッシュプラグインを有効化したのに何か遅いし効いているかどうかわからないという場合には、ログを使ってアクセス状況やキャッシュの使用有無や実行時間を確認してみてください

キャッシュ処理が行われた場合は Hit や not_modified が表示されその実行時間が表示されます

キャッシュされない場合は、ログインユーザーやコメントユーザー(承認待ち)のブラウザクッキー(COOKIE)が影響している場合があります。実際にはログイン状態でないのに何らかの原因で wordpress_logged_in_xxxxxxxxxxx のようなクッキーが残っているとキャッシュ表示しません。

また、PHPエラー(ワーニング、ノーティス含む)が発生すると表示されるページが意図しているものかどうかわからないのでキャッシュしないようにしています。従って特定のプラグインやテーマでPHPエラーが出るものを使っているとキャッシュされないページが多くなると思われます

yasakaniログ画面例

管理画面では、最新のログを100件表示しているだけですが、データベースには最大10万件のログが保存されています

データベースファイルは、簡単にダウンロード出来るようになっていますので、SQLiteデータベースの操作をマスターしている方なら、ダウンロードしたデータベースから詳細なアクセス解析を行うことも可能です

※ログデータを含むデータベースファイルは Ver0.8.2 で直接アクセス出来ないように Apache サーバー用に .htaccess ファイルで制限しました。但し、Apache 以外のサーバーをお使いの場合は、管理者が wp-content/yasakani-cache/yasakani_cache.db ファイルに直接アクセス出来ないよう対策を行うようお願いいたします

※実行時間は SQLiteデータベースに接続からデータを出力するまでの時間を内部的に測定した時間なので通信時間は含まれていない値です

※ログに記録されるのは、WordPress に渡されてきたリクエストのみです。Webサーバーで処理される要求に関してはログに保存されません

 

さらに高速化するには

このプラグインのページキャッシュ処理は、PHPとSQLiteを使って処理しています。 効果としては waiting(TTFB)時間を短縮するだけです。さらに高速化するためのいくつかの方法を紹介します

  1. 高速なサーバー環境
  2. 必要なプラグインのみの使用
  3. 画像データの最適化
  4. GZip圧縮やブラウザキャッシュの使用

 

サーバー環境

基本的なサーバー環境が遅いと高速化は望めません

ポイントとしては、回線容量やCPUコア数、メモリ容量、SSD使用、PHP7使用等を基準に選択すればよろしいと思います

また、共有サーバーのほとんどは Apache サーバーだと思われますが、Nginxサーバーが使えるならさらに高速化できるかもしれません

プラグイン

WordPressは、プラグインをたくさん使用しているとどうしても遅くなります

特定のページのみで必要なプラグインを常に有効化しておく必要はありません
Plugin load filter を使うとそのページで必要なプラグインだけを有効にすることが可能です。不必要なプラグインを無効化すれば関連するCSSやJSファイルも読み込まずに済む場合があります

WordPress Plugin : Plugin Load Filter
WordPress で沢山のプラグインを使用している場合に Plagin Load Filter プラグインを使うと、ページタイプや投稿フォーマット、カスタムポストタイプ毎に有効化するプラグインを動的に選択することが出来ます。 プラグインの読み込みを減らし、ページ表示のレスポンスを高速化する効果があります (^^)…

これを活用すれば、キャッシュ対象外のページで若干高速化することが出来ますし、キャッシュするページに対しても無駄なCSSやJSを取り除ける効果があります(不要なJS,CSSを取り除いたHTMLページがキャッシュされるので)

画像

画像データはどうしても通信量が増加するので、ページ内で使用している枚数、画像サイズ、圧縮率等の削減を行うことで通信データの削減と通信時間の短縮を行うことが大切です

たくさんの画像を使っている場合は、レジーロードを使ってファーストビューの通信量を削減するのも効果的です

Gzip 圧縮、ブラウザキャッシュ

YASAKANIキャッシュでは、Apache サーバーの .htaccess ファイルに変更は加えていませんので、.htaccess ファイルを編集して mod_deflate、mod_expires または mod_pagespeed 等を活用してブラウザキャッシュや圧縮を使い高速化できます

mod_deflate HTML, CSS, JS のHTTP通信をGZIP圧縮して転送
クライアントは、HTTPリクエストのAccept-Encodingヘッダーでサポートしている圧縮方法を示します
Webサーバは、HTTPレスポンスを返す際に、Content-Encodingヘッダーで圧縮した方法を知らせます
mod_expires ブラウザで取得したコンテンツ(HTML, CSS, JS, 画像データ等)をキャッシュさせ、有効期間を設定するキャッシュさせることで、httpリクエスト数もサイズも減らせることが出来ます

詳細は下記記事を参照してください

mod_deflate, mod_expires を使用してHTTP通信データ量を削減
先日、Googleの PageSpeed で診断したところ、高い優先度の改善提案が表示されたので、データのGZ&

また、最近では、他に Google が公開している mod_pagespeed というモジュールもありますので、使用可能ならこちらを使用したほうが簡単に高速化できるかも知れません

とても多機能で画像の圧縮やCSS,JSの圧縮、統合、ブラウザキャッシュ有効期間設定等でデータ通信量をかなり削減できるようです

※.htaccessの編集を行う場合は十分に調べてから行ってください。また、元の .htaccessファイルをバックアップすることを忘れないでください

 

免責事項

本ソフトウェアを使用した事による、いかなる損害も作者は一切の責任を負いませんので、自己責任の上でご使用下さい

 

履歴

2016-09-12 Ver0.9.1

  • PHPエラーが発生していたので修正しました

 

2016-09-09 Ver0.9.0

  • APC/APCu をSQLiteのクエリーキャッシュに使用するモードを追加(ベータテスト版)

 

2016-09-02 Ver0.8.3

  • アクセスログ表示の REQUEST_URI, HTTP_REFERER を urldecode 表示に変更
  • 画像等の添付ファイルステータスの継承(’inherit’)をキャッシュ対象外と判断していたので親の投稿記事のステータスが公開(’publish’)ならキャッシュするように修正
  • マルチサイト時のサブサイトでキャッシュ無効時の処理が不完全だったので修正

 

2016-08-23 Ver0.8.2

  • WP_CACHE 定義の挿入置換処理修正
  • DB ファイルパス変更 (wp-content/yasakani-cache/yasakani_cache.db).
  • DB ファイルの直接アクセス禁止処理追加(但し、Apache server .htaccess のみ)
  • キャッシュ有効期間の設定に 4 時間を追加
  • Firefox 使用時にリロードで設定データ表示が更新されるよう autocomplete=”off” を指定

 

2016-08-19  Ver0.8.1 公式サイトにて公開

 

WordPress Plugin : YASAKANI Cache” への4件のコメント

  1. 記事を拝見して質問があります。

    ■質問①
    確認の意味で質問ありますが、

    WP Super Cache 等の他のキャッシュプラグインが既に advanced-cache.php ファイルを生成していると競合してしまいます。

    既に(利用する前に) advanced-cache.php ファイルがある場合は削除して「YASAKANI Cache」をインストールしてくださいという認識で大丈夫でしょうか?

    ■質問②
    ログ機能に関しては、ログの削除機能は付いているのでしょうか?
    最新のログが検出されて古いログは上書きされるので削除機能は付けていないという事であれば、
    利用者の任意でログの検出件数を任意で選択できたら良いかと思いますがどうなんでしょうか?

    1. ご質問にお答えします
      1.YASAKANI Cache は、他のキャッシュプラグインで既に advanced-cache.php ファイルが作られているとインストールしてもページキャッシュ機能を有効化出来ないようになっています。(既存の advanced-cache.php ファイルを消したり置き換えたりはしません)
      キャッシュプラグインを既に使用している場合は、そのプラグインの正規の手順で無効化やアンインストールを行ってみて下さい。多くの場合はそれで advanced-cache.php ファイルが削除されているはずです。まれに削除されずに残ってしまう場合もありますが、その場合は FTP 等を使って advanced-cache.php ファイルを削除すればOKです。

      2.ログに削除機能はついていません。古いログは上書きされます。

      ログはキャッシュとしては、パフォーマンスにも影響するし、動作確認としての意味しかないおまけ的な機能なのですが、将来的にはこれを利用して人気記事ランキングウィジェットを作るとかにも展開できるかなと思っています。ただ、ほとんど使われていないプラグインですし、フィードバックもほとんどないのでどのように展開していくか思案中というところです。

  2. WordPress4.7でやってみたところ、有効化した途端にダッシュボードなどが消えました…..
    FTPでYASAKANI CACHE を削除したら元通りになりましたが…

    1. 不具合動作のご報告ありがとうございます

      本日、ローカルなテスト環境に WordPress 4.7-RC2-39491 を入れてみましたが、こちらでは動作しています

      そちらの環境では WP4.6 では動作するけど WP4.7 だと何かしらエラーが発生しているということでしょうか?
      もうすぐ WP4.7 もリリースされると思いますので、引き続き調査します

コメントを残す