W3 Total Cache導入

ミニバードに移転したついでに軽量化と高負荷対策のためWordPressにインストールしたプラグインを見直す事にした。まず槍玉に上がったのがキャッシュプラグインだ。

キャッシュプラグインはアクセスの多いサイトが使うもので、零細ブログが使ってもあまり意味がないという論をよく見る。だが、今時はSNSで拡散されて何時バズったり炎上するかわからないご時世なのだ。転ばぬ先の杖、という事で導入する価値はあると思う。それにサーバー応答時間の改善にはページキャッシュがやたらと効く。

さくらのサーバー時代ではWP Fastest Cacheを愛用していた。設定が簡単なので導入も楽だし不具合もなかった。ただモバイル用テーマのページキャッシュ機能は有料なんである。最近はうちのブログも6~7割がスマホなのでこれは痛い。そこで無料でもスマホ用のページキャッシュが作成できるW3 Total Cacheに移行する事にした。

W3 Total Cache

さて、何気に困ったのがW3 Total Cacheの設定。さすがにGeneral Settingの『Toggle all caching types on or off (at once)』なんてONにする勇気はない。各項目を個別に設定していくわけだが、意味がわかるもの・わからないもの、意味はわかるけど数値の目安がわからない…という有様。

あれこれ検索した結果、とても参考になったのが以下のページ。
『W3 Total Cacheの設定を通して学ぶ、WordPressを高速化するキャッシュの仕組み』
『こだわる人のWordPress3大キャッシュプラグイン徹底比較』
WordPressキャッシュ系プラグインの比較とサイトに適した選び方

数年前の記事で一部現行のバージョンと違う部分もあるようだが十分参考になるはず。

ページキャッシュ

上記の記事で知って「ΩΩΩ<な、なんだってー!?」と思ったのが
・ キャッシュの有効期限は設定画面から変更できない!
・ したがって自分でmaster.phpを書き換えない限り有効期限は3600秒(1時間)で固定。

これを知らずに設定するとただサーバーの負荷を増やしただけになりかねない。例えばガベージコレクションの期間を長くとってプリロードをONにすると、ガベージコレクションが行われる前にプリロードしたキャッシュの有効期限がきちゃう…なんて事になる。

デフォルト値の場合、キャッシュ有効期限1時間にガベージコレクト周期が1時間、つまり1時間以上2時間未満がキャッシュの正味の寿命といっていい。

このブログの場合は更新頻度も低いし来客も少ないので、キャッシュの保ちと適度なリフレッシュのバランスを狙ってとりあえずLifetime21600秒、ガベージコレクション21600秒に設定してみた。

ページキャッシュの挙動
アクセスされたページにpgcache.lifetimeで指定した有効期限のキャッシュが作成。(その後アクセスがある度に有効期限がリセット?)
有効期限内にアクセスがなかった場合は.oldの拡張子が付与

ガベージコレクションはoldファイルと生成時期が古い(アクセスによって有効期限が延長されていても)キャッシュを消去。

プリロード

プリロードのデフォルト値は900秒(15分)毎にサイトマップを辿って10ページロード。こりゃ共用サーバーなんかじゃやりすぎで設定画面でも「Limit the number of pages to create per batch. Fewer pages may be better for under-powered servers.」と注意書きがある。

サーバーの負荷が増すだけだからOFFにしろと書かれている事が多いが、適切な間隔とページ数に設定すればなんら問題ないはず。……と思ったが、総記事数とプリロード数、そしてガベージコレクションの周期設定の関係上、有効に機能する環境は極めて少ない。GC終了からGC開始までに全ての記事とはいわずとも半分くらいはプリロードして欲しいのだが……。
関連記事表示などのシャッフルが効かなくなってもよいのならGCを一週間とかにすれば、まあ何とかならんでもないけれど。

サーバーのログを見るとちゃんと指定した間隔でサイトマップを辿り記事を読みに行っていようだ。そしてoldファイルの場合はキャッシュが再生成される。期限前のキャッシュも読みに行くのだが、タイムスタンプは変わらないまま期限がリセットっぽい?

しかし予想はしていた事だが、スマホ用のページはプリロードされない。なので当ブログで使用しているSimplicityのようなPCとスマホでページが分かれる準レスポンシブとは相性が悪い。

Minify

MinifyについてはHTMLの縮小とJSの結合のみ使用。Simplicityは細かいCSSが多いのでCSS結合もしたかったのだが、デザインが狂ったりJSの実行が微妙に怪しくなったりなど、どうにも信用しきれない部分がでてくるので断念した。

一応ではあるが、Simplicity親テーマで@importになっている部分をlinkに書き換えてからmobileページ用以外のCSSを結合してJSをAsyncsrcにするとそこそこいい感じ。

MinifyのJSの「Embed type」項の解説はこのページの解説がわかりやすい。
Improve web page load times. Sibra: Cambridge web development
古いブラウザの対応を考えないのならAsyncから下を好みでという感じ。

※追記
結局CSSはW3のMinifyを使わず手動で結合する事にした。これをやったところで人間が体感できるような差はでないので自己満足の領域だ。

jqueryはWordPress付属のものでなくgoogleから取得している。googleからのほうが読み込みは速いのだがPageSpeed Insightsではスコアが落ちる。外部からというのがイカンようだ。

スコアに意味はないとしか思えないのでPageSpeed Insights対策も兼ねてjqueryをフッターで読むようにしていたのをやめた。そしてMinifyで纏めたJSをAbove foldに関係しそうなものを<body>の直後、それ以外を</body>前にAsyncで読み込むよう設定。これが効果てきめんで明らかにページ読み込みの体感速度が上がった。

……のだが、Chromeのコンソールで確認するとエラーが出てるっぽい。閲覧していて特に不具合はないみたいなので納得がいかないが、念の為Minifyを使わず普通に読んでエラー回避する事に。

スケジュールの注意点

W3 Total Cacheのガーベージコレクションのようなタスクは設定をセーブした時刻でそのまま決定され設定画面での変更はできない。WP-Crontrolのようなプラグインで時刻など編集が可能。

なお、時刻をいじったタスクはW3の設定で実行間隔などを変更してもタスクに内容が反映されないままになってしまう。しかもW3の設定で機能をOFF→ONすると時刻をいじったものは残ったまま別のタスクが新しく生成されてしまう。
いったんタスクを削除してからW3の設定を変更・セーブしてタスクを再生成する必要があるので要注意。


追記:WordPressのテーマをSimplicity2から軽量テーマのWpTHKに変更したのをきっかけにW3 Total Cacheの使用停止。理由は2つあって、まずWpTHKの作者さんもキャッシュ使用を薦めていないというのが一点。もうひとつはWpTHKが完全レスポンシブなのでスマホとPCでウィジェットなどの表示内容を変えるとキャッシュONだと問題が出るだろうという点。

 
スポンサーリンク

PAGE TOP
Do NOT follow this link or you will be banned from the site!