wordpressのobject-cache.phpが変な動きをしたのでメモ

wordpressのobject-cache.phpが変な動きをしたのでメモ。

自分のサイトではmemcachedを利用してキャッシュを利用している。これが結構な負荷軽減に役立っている(ようにみえる)ためにお気に入りだ。

制作者はryanっていう有名な人らしい。あまり更新してはないみたいだけど。

あとは変な使い方をすると変な挙動をする。おかげで何度もコードを走査する羽目に。

変な使い方というのは、複数のwordpressから一つのmemcachedサーバを利用した場合、キーのプリフィックスがかぶってしまう。

object-cache.phpでは$blog_idを設定することでかぶらないようにしてるんだけど、是って実はwordpressMUとかの、一つのwordpressでかぶるのを防ぐ、っていう。

is_site_admin()がロードされてる場合にはMUと判断するみたい。最新版だと3.0以降で、is_multisiteっていう関数を使って判断している模様。

で、自分は一つのウェブサーバ、一つのmemcachedサーバで複数のwordpressを運用している。それもMUではなく。

virtualhostでdocumentrootを切り分けているのだ。

なので別個のブログごとに切り分ける必要がある。

memcachedを利用するobject-cache.phpについて。

revisionは182802

これの下の方、

global $blog_id, $table_prefix;
$this->global_prefix = ( function_exists('is_site_admin') || defined('CUSTOM_USER_TABLE') && defined('CUSTOM_USER_META_TABLE') ) ? '' : $table_prefix;
$this->blog_prefix = ( function_exists('is_site_admin') ? $blog_id : $table_prefix ) . ':';

$this->cache_hits =& $this->stats['get'];
$this->cache_misses =& $this->stats['add'];

is_site_admin()が定義されているかどうか、というのは(wordpress標準機能の)マルチサイトか否かと読み替える。

$this->global_prefixは、マルチサイトもしくは(CUSTOM_USER_TABLEが定義されててMUSTOM_USER_META_TABLEが定義される)状態であればプリフィックスなし、マルチサイトではなくて定数二つが定義されてなければ$table_prefix(wp_とか)を使う。

$this->blog_prefixは、マルチサイトであれば$blog_idを、そうでなければ$table_prefixを使う。

この二つの変数は主に、

function key($key, $group) {
if ( empty($group) )
$group = 'default';

if ( false !== array_search($group, $this->global_groups) )
$prefix = $this->global_prefix;
else
$prefix = $this->blog_prefix;

return preg_replace('/\s+/', '', "$prefix$group:$key");
}

で利用される。

ここで、$groupがglobal_groups(‘users’, ‘userlogins’, ‘usermeta’, ‘site-options’, ‘site-lookup’, ‘blog-lookup’, ‘blog-details’, ‘rss’)に含まれていれば$global_prefixをつけ、そうでなければblog_prefixを利用する。


--- object-cache.php.orig       2009-12-15 04:04:08.000000000 +0900
+++ object-cache.php    2010-12-01 09:03:35.000000000 +0900
@@ -362,8 +362,8 @@
}

global $blog_id, $table_prefix;
-               $this->global_prefix = ( function_exists('is_site_admin') || defined('CUSTOM_USER_TABLE') && defined('CUSTOM_USER_META_TABLE') ) ? '' : $table_prefix;
-               $this->blog_prefix = ( function_exists('is_site_admin') ? $blog_id : $table_prefix ) . ':';
+               $this->global_prefix = $blog_id ? $blog_id : $table_prefix;
+               $this->blog_prefix = ($blog_id ? $blog_id : $table_prefix) . ':';

$this->cache_hits =& $this->stats['get'];
$this->cache_misses =& $this->stats['add'];

「wordpressのobject-cache.phpが変な動きをしたのでメモ」への1件のフィードバック

コメントを残す