カテゴリー
ブログ

WordPressでAPCuを使う


はじめに

レンタルサーバー(エックスサーバー)で APCu というデータキャッシュが使えるようになっているので、これを WordPress で使うために何をすればよいかを調べた(結論からいうととても簡単だった)。

  1. APC/OPcacheについて(エックスサーバー)
  2. APC User Cache(PHP マニュアル)
  3. Class Reference/WP Object Cache (WordPress Codex)
  4. 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の使われ具合を確認する

APCuを使うだけならば、以上。APCuの働き具合を確認するためのファイルも簡単に設置できる。

APCu のソースコード krakjoe/apcu: APCu – APC User Cache (GitHub) に同梱されている apc.php というファイルを Web サーバーのどこかに置けばよい。

効果を確認する

キャッシュの効果を Query Monitor というプラグインで測定した。テスト対象はサイトのトップページ。

ページ生成時間 [S]最大メモリ使用量 [kB]データベースクエリー [S]クエリー数[Q]
10.1616,5310.031997
20.1215,5760.012429

SQLを発行する回数が97から29と3割以下になっている。キャッシュされないクエリーを調べてみると、多くがget_posts()だった。get_posts()はオブジェクトキャッシュの対象外らしい。