キャッシュのキーが共通なので、xcache for wordpressを入れたりしてキャッシュを効かせる状態だと複数blogを入れられないようだ、という話。
もともとWordPressは複数のblogを管理することが考えられていない。公式のやり方はあるが、DB名かテーブル名がぶつからないように気をつけながら複数のツリーを持つという、鈍くさい方法。本来はWordPress MUというちょっと互換性のないプロジェクトが担当している。
しかし工夫はできるはず、と思い、このへんを検索してシンボリックリンクと$table_prefixを使えばけっこう楽にできるなぁと当たりをつけていた。
試しにやってみる。
# cd webdir
# ln -s wordpress testblog
# vi wordpress/wp-config.php
(REQUEST_URIを見て$table_prefixを切り替えるように変更)
そしておもむろにtestblog/wp-admin/install.phpにアクセスすると、すでにインストールされている、というお達し。おかしいなぁと思ってheader("X-TP: $table_prefix");として確認してみたが、$table_prefixは正しく設定されている。しかしテーブルがないのにインストール済みという。is_blog_installed()のソースを見ていくと、キャッシュに当たっているためのような気もする。
試しにxcache for wordpressを無効にしてみると、複数作ることができた。
xcache for wordpressのソースでは、キーの文字列にABSPATH(=dirname(__FILE__)."/")を付与して区別している。なので、WordPressの標準的な鈍くさい複数blogインストール(複数の実体をインストールしてDB名か$table_prefixがぶつからないようにする)の場合は区別されるが、シンボリックリンクでは__FILE__が実体のファイルを指してしまい、キャッシュエントリのキーが同一になるのだ。
キャッシュのキーにDBNAMEと$table_prefixを付与してくれればいいと思う。…と思ってkey()関数を変更してみたけどあんまりうまくいかなかった。PHPは慣れてないし、これ以上はよくわからないな。
まあコードキャッシュだけで、変数キャッシュはなくてもいいような気もするね。MySQLのクエリキャッシュに当たればペナルティも少ないんじゃないかと、楽観的な予想。
でもシンボリックリンクの方法って、普通にやってるとアップロードしたファイルがごっちゃになるかもしれないね。他にも不具合が出る可能性が高い予感。複数管理するつもりなら、MTやNucleusのほうが良かったかな。MTは勘弁だけど。