はじめに
レンタルサーバー(エックスサーバー)で APCu というデータキャッシュが使えるようになっているので、これを WordPress で使うために何をすればよいかを調べた(結論からいうととても簡単だった)。
- APC/OPcacheについて(エックスサーバー)
- APC User Cache(PHP マニュアル)
- Class Reference/WP Object Cache (WordPress Codex)
- l3rady/WordPress-APC-Object-Cache (GitHub)
3. は WordPress Codex 内で唯一APCuに言及しているページ。4. はそのなかで「APCuを用いてWordPress オブジェクトキャッシュに永続的なバックエンドを提供する」と紹介されていたページ。
キャッシュ関連関数 wp_cache_*() をAPCu版に置き換える
4. には object-cache.php と README 文書しかない。README 文書を読むと、object-cache.php を /wp-content フォルダーに置けとだけ書いてある。
これだけでなぜ動くのか。調べてみると、wp_start_object_cache() 内で/wp-content/object-cache.php があれば読み込むようになっていた。
if ( $first_init ) {
if ( ! function_exists( 'wp_cache_init' ) ) {
if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
require_once WP_CONTENT_DIR . '/object-cache.php';
この仕組みによって wp_cache_add() などの標準関数を外部関数に置き換えることができる。この仕組みは drop-in と命名されているらしい。_get_dropins() を呼び出すと一覧できる模様。シングルサイトでは8種のドロップインがあるようだ。
APCu を動かしてしばらくすると管理画面でおかしな挙動が見受けられるようになったので、ファイルの冒頭に以下のコードを挿入した。
if ( is_admin() ) {
return false;
}
APCuの使われ具合を確認する
APCuを使うだけならば、以上。APCuの働き具合を確認するためのファイルも簡単に設置できる。
APCu のソースコード krakjoe/apcu: APCu – APC User Cache (GitHub) に同梱されている apc.php というファイルを Web サーバーのどこかに置けばよい。
効果を確認する
キャッシュの効果を Query Monitor というプラグインで測定した。テスト対象はサイトのトップページ。
回 | ページ生成時間 [S] | 最大メモリ使用量 [kB] | データベースクエリー [S] | クエリー数[Q] |
1 | 0.16 | 16,531 | 0.0319 | 97 |
2 | 0.12 | 15,576 | 0.0124 | 29 |
SQLを発行する回数が97から29と3割以下になっている。キャッシュされないクエリーを調べてみると、多くがget_posts()だった。get_posts()はオブジェクトキャッシュの対象外らしい。