wordpress/Adobe Animate CCなどweb技術やブログ運用に関する話をしていきます!検索エンジン最適化に関する実験に関する情報も!
⇒ 本ブログの詳細/連絡先はコチラ!
web技術TOP WordPress アクセスアップ Adobe Animate CC 便利ソフト/サービス紹介 効率化
  1. ホーム
  2. 〇ブログ/web技術
  3. WordPress
  4. WordPress高速化
  5. APC/APCUキャッシュの威力が凄い!WordPressで100を超えるDBアクセスが30程度に激減!
■注目記事一覧

高校数学 教科書用シミュレーターの制作に携わりました!!

Adobe Animate CC(旧FLASH)が凄い!技術者にこそ是非!

デジハリのAdobe講座がやばすぎる!Adobe Creative Cloudが45%オフで購入可!

画像素材サイト「写真AC」が超お得でおすすめです!

WordPressのGutenbergで秒速で設定済みブロックを呼び出す方法!

[Adobe Animate CC使い方講座] まずはFlashからの変遷から解説!

ブログ記事数500突破!開設から2年3ヵ月のアクセス数変動を振り返ってみた!
 
全テーマ共通記事一覧

APC/APCUキャッシュの威力が凄い!WordPressで100を超えるDBアクセスが30程度に激減!

自分がWordPress利用環境としてレンタルサーバーからVPSに移行した一番の理由が、「APC/APCUキャッシュを使用したいため」です。APC/APCUキャッシュについては後ほど詳しく説明しますが、自分はこのAPC/APCUキャッシュを使用することで、1ページ表示させるためのDBアクセスを110程度から30程度に激減させました!

キャッシュする仕組みは様々なものがありますが、大半はページキャッシュという「ページ単位でキャッシュする」仕組みです。それに対して、APC/APCUキャッシュは「ページよりも細かい単位でキャッシュできる仕組み」です!うまく使えば、全くIO/ディスクアクセスを発生させない、超高速なWordPress環境を作る事さえ出来ます。

あまりAPC/APCUを活用されている方がいらっしゃらないように感じましたので、本記事ではそのAPC/APCUの魅力、その他キャッシュ方法の問題点などを語りたいと思います!WordPressを超高速化したいと思っている方は、是非参考にしてみて下さい!

↓APC/APCUキャッシュの命令の一覧。簡単な命令でキャッシュの書き込み/取り出しが可能なのです!

ページキャッシュは整合性などで、様々な問題がある!うまく制御できない。

コチラの記事でも書きましたが、各ページキャッシュには様々な問題があります。一つは不整合の問題です。ページ単位でキャッシュするので、ページの一部だけ更新したい場合に対応できなくなり、古い情報が出続けた状態になってしまいます。

例えば、下図のスクリーンショットの赤枠で示したカテゴリ一覧の部分の内容が更新された場合、この部分は共通パーツなのでカテゴリ内の全てのページで更新する必要が出てきます。すると、何百ページもキャッシュクリアしなければいけません。キャッシュを全部捨てなきゃいけなきゃならないのです。カテゴリ一覧は新しく記事やカテゴリを追加するごとに更新されるため、本来的にはキャッシュを毎回捨てなきゃいけないんです。でも、1記事追加するごとに全てのキャッシュを捨てていたら意味がないですよね

また、ページキャッシュはスマホとPCページが混合してしまい、下図のように「PCページでみているのにスマホページが表示されてしまう」という事が平気でおきます。ページキャッシュは高速な分、非常に荒っぽいのです。高速化は大事ですが、そのために崩れたページを表示させてしまっては、本末転倒ですよね><

APC/APCUキャッシュなら、ページ単位よりも細かい単位でキャッシュ出来る!

上記の多くのキャッシュ機構は、ページ単位でのキャッシュになります。ですので、ページの一部でも変わってしまったら、全て更新が必要になります。極論を言うと、ページにアクセスカウンタがあった場合は、毎回更新するために毎回ページキャッシュを捨てなきゃいけないんです!これじゃ、全くキャッシュしている意味がないですよね。

それに大して、APC/APCUならより細かな単位、違った単位でキャッシュすることが出来るのです!PPC/APCUは下図のように、プロセス間で共有のキャッシュ領域としてデータが維持できるようになるんです。ですので、リクエストごとに共通となるデータをメモリキャッシュとして保存できるのです!メモリなので非常に高速に共通データにアクセス出来るようになるんですね!

例えば上記のカテゴリ一覧のパーツでも、APC/ACPUキャッシュならその単位でキャッシュできますので、この部分を更新したい場合は、この要素のキャッシュを更新すれば良いだけなんです!整合性をあわせたり、部分的なパーツごとにデータ更新する事に適しているんです!

APC/APCUキャッシュは導入しただけでは全く意味がない

このAPC/APCUですが、ただ導入しただけだと何の意味もないです。APC/APCUはあくまで、「データをキャッシュできるボックス」を提供してくれるだけであり、デフォルトではどこにも利用されません。キャッシュをどう使うかはプログラムの組み方次第です。

多くのIOアクセスがある箇所を見つけて、APC/APCUキャッシュを適用していき、高速化していく事が重要です。使用するキャッシュ量の割に、効果が薄いところに適用しても意味がないので、「適用によるディスクアクセスの減少量」と「使用するAPC/APCUキャッシュのメモリ量」「キャッシュが更新される頻度」などを考慮して、どこに適用するか考えていきます!

APC/APCUの導入の仕方

この、便利なAPC/APCUですが、環境によって使える/使えないの差があります。また、導入方法が異なります。主な導入方法は以下の通りです。

レンタルサーバー:使えるところも多いが、1分単位ぐらいでキャッシュが消えるため使いものにならない(共用利用のため?)
KUSANAGIサーバー:最初から導入されているので、すぐに使える!ただし、PHPの再起動に注意!
VPSサーバー(純WordPress):自分でAPC/APCUをインストールする必要あり。

まずですが、レンタルサーバーでAPC/APCUは使えません。なぜなら、上記のようにAPC/APCUはプロセス間の共通キャッシュのため、多くのユーザが同じOSで動いているレンタルサーバーでは使えないのです。正確にいうと、APCUにデータを突っ込んでも、1分ぐらいで消されてしまう感じでした(エックスサーバー等で動作確認)。なので、APC/APCUが使いたい場合、VPSなどを使うのが必須かと

VPSでWordPressを使う場合、KUSANAGIという高速動作環境を選択するのが今の主流だと思います。これであれば、自動的にAPC/APCUが使用できる状態になっていますし、楽ちんです。しかし、KUSANAGI導入時は注意が必要です。実はKUSANAGIはmotionという監視機構があり、デフォルトで「500エラーが2回連続発生すると、phpを再起動させる」という設定がなされています。phpが再起動になると、APC/APCUキャッシュが全てクリアされます。ですので、このmotionの設定は無効、あるいは緩めの設定にしておいたほうが良いと思います。頻繁にキャッシュが消えると、逆にオーバーヘッドになってしまいますからね。

↓KUSANAGIのmonitに関する記事。
https://column.prime-strategy.co.jp/archives/column_826

その他、純粋にWordPressをVPSに導入する場合は自分でAPC/APCUをインストールする必要があります。APC/APCUをインストールするときには、peclというPHPの拡張機能が必要になりますので、まずpeclを導入し後にAPC/APCUを導入する手順になります。

[参考ページ]
https://qiita.com/nnmr/items/423aac4f66b0b1a4b06c

VPSにAPC/APCUを導入した場合、GUIキャッシュ管理機能を導入する事をおすすめします!

APC/APCUキャッシュを導入した時には、GUIキャッシュ管理機能も導入する事をおすすめします。この機能は、webページから現在のAPC/APCUキャッシュの状況を確認できる機能です。下図のように、現在のキャッシュのサイズや、キャッシュのヒット率、キャッシュのフラグメンテーション情報などが一覧で確認できます!どのようなキャッシュデータが入っているかも確認できるため非常に便利です。

KUSANAGIにも最初は入っていません。なので自分で導入する必要があります。下記ページ等を参考にすれば、簡単に導入することができます。ダウンロードして、webサーバーのフォルダに配置し、パスワード等を設定するだけです。

[参考ページ]
https://oki2a24.com/2014/09/26/how-to-show-apcu-gui-page/

おすすめのAPC/APCUの使い方。必ずデータのバージョン番号を付けよう!

APC/APCUを使うにあたって、必ずやっておいたほうが良い事があります。それは、データバージョンの設定です。そして、データバージョンが変わった時には、データは無効とみなすようにしておくと良いです。

何故かと言うと、「キャッシュを無効化させるために関連するキャッシュを削除する処理は、面倒だし負荷がかかる」からです。例えば、キャッシュをある用途に1000個ためこんでいたとすると、その用途のすべてのキャシュを初期化するためには、1000個全てに削除命令を出さなきゃいけません。これはそれなりのオーバーヘッドになりますし、何よりその処理を書くのが面倒です。

そこで、下図のように(データ、データバージョン)という2つのセットにして、キャッシュを登録するようにします。データバージョンは、1とか2とか整数で指定すればいいかと。そして、キャッシュを取り出すときには必ずバージョンが一致しているか確認するようにします。すると、プログラムのキャッシュ指定バージョンを上げるだけで(例えば最新データバージョンとして3を指定)、全てのキャッシュを実質無効化できます。これぐらいの制御であれば、オーバーヘッドにもなりませんし、利便性が格段に上がります。そのため、データにバージョン情報をつけておくことをオススメします!

バージョン付きAPCUアクセス例(プログラム)

以下の例は自分が使っているAPCUへの保存/参照/削除インターフェイスの例です。こんな感じで、バージョンとともにデータを格納しておくと、バージョンアップしたときにわざわざデータを削除する必要がなくなります^^ また、どのクラスのどのメソッドで使うキャッシュか分かるように、クラス名/メソッド名/パラメタ名の3つは必須にしています。

functions.php
function getCacheVer($classname,$methodname,$para,$ver){
    ///APCキャッシュ系
    //echo "noe cache0";
    $temp1=apcu_fetch($classname."/".$methodname."/".$para);
    if ($temp1==false){
        return null;
    }else{
        //バージョンチェック
        if ($temp1[0]==$ver){
            //同じ
            return $temp1[1];
        }else{
            return null;
        }
    }
}
function setCacheVer($classname,$methodname,$para,$val,$ver,$ttl=8640000){//デフォルト100日
    ///無条件にセット
    apcu_store($classname."/".$methodname."/".$para,[$ver,$val],$ttl);
}
function deleteCache($classname,$methodname,$para){
    apcu_delete($classname."/".$methodname."/".$para);
}

まとめ:APC/APCUキャッシュは不整合を起こさないキャッシュ形態!ディスクアクセスをなくし、高速なリクエスト処理を実現させます!

最後にまとめです。APC/APCUはものすごく利便性の高いキャッシュ機構です。その他のページキャッシュが、ページ単位でしかキャッシュが保存出来ないのに比べ、APC/APCUキャッシュはそれより細かい単位でデータをキャッシュできます!例えば、「カテゴリ一覧」「最新記事一覧」といったページ内のパーツ単位でキャッシュができるわけです。

こうすることで、きめ細かやかで不整合のないキャッシュが可能になります!ページキャッシュほど高速ではないかもしれませんが、DBへのアクセスを極端にへらすことが出来ます。自分は、このAPC/APCUキャッシュの活用で、1ページあたりのDBアクセスを110程度⇒30程度に減らす事に成功しました!これだけでも、かなりの高速化になるのが分かっていただけると思います!

他のキャッシュと違って自分の思ったとおりにキャッシュを使う事ができますので、非常に楽しいです。APC/APCUを使うためにはVPSが必要になりますが、そのためだけにVPSに移行する価値もあるのではと思ってます!是非、ご検討してみて下さい!

[APCUの公式ドキュメントページ]
http://php.net/manual/ja/book.apcu.php




⇒「WordPress高速化」カテゴリ記事一覧

その他関連カテゴリ

↓WordPressでブログ始めるならエックスサーバーがおススメ!




お気軽にコメントお願いします!

Your email address will not be published. Required fields are marked *