久しぶりに自分以外のNucleusを触る機会があったんですが、memcacheを組み込んでいないNucleusの動作のモッサリ加減に閉口。memcacheを組み込んでいるNucleusとは明らかに速度が違います。現状の1ページ表示するのにmysqlに100回とかクエリを投げているのはどう考えてもサーバにやさしくないので、Nucleusコアに汎用のキャッシュマネジメントをする機構が必要なんではないかと思いました。
ということで、以前に作ったmemcacheコア改造を汎用化すると同時に、キャッシュの書き出し先をmemcacheだけでなくファイルにすることも可能なように改造してみました。
† 実装のポイント
汎用化しようとすると、キャッシュのkeyの衝突を防ぐ必要が出てきますが、これについては以前にしづきさんが関数の呼出元の関数を取得する関数で書かれていたdebug_backtrace()を使ってクラスごとに名前空間が別になるようにすれば管理が簡単そうなので、これを使うことにします。
ファイルレベルのキャッシュマネジメントについてはpearのCache_Lightに任せてしまうと簡単そうなので、これを使うことにします。Cache_Light.php自体はファイル単独で動作可能で、ライセンスもlgplなのでNucleusとのライセンス矛盾も無くその辺りの問題もクリアできそうです。
これらのキャッシュマネジメントを担う部分をCACHEMANAGER.phpというファイルに集約し、プラグインなどからは
という感じで呼び出し可能にしておきます。
† 早速ベンチを取ってみる
ファイルベースのキャッシュだと多数のファイル開いたりをロックしたりしないといけないので、memcacheよりは若干遅くなるようですが十分効果があることがわかりました。コアに色々と改造が入ってしまうので、一旦パッチにまとめてフィードバックしたいなと思っています。
† patchにまとめてみました
ということでpatchにまとめたので置いておきます。
nucleus330jp-cachemanager.patch[110clicks]
デフォルトでmedia/cachemanagerにキャッシュを置くようになっていますので、このディレクトリのパーミッションを777にするとキャッシュが効くようになります。
※このディレクトリはウェブから参照できないように空のindex.htmlを置くなどの対策をお勧めします。
試してみます。ってかプラグインらの改造も必要なんですよね?どこで CACHEMANAGER::get($key); とか呼んだらいいんでしょうか?
あ、ありがとうございます。
普通に入れる分にはプラグインは特にいじらなくても大丈夫です。。。。。
libs/PLUGIN.phpに改造が入るので、プラグインオプション関連は自動的にキャッシュされるようになりますんで、普通はこれで十分だと思います。ちょっとわかりにくくて申し訳ないんですが、CACHEMANAGER::get($key);の部分はそれ以外にも独自にキャッシュを使いたい場合のインタフェイスということでご理解いただければと。
うーん、思ったよりpatchはダウンロードされてるなぁ。。。。。
ということで、動作報告お待ちしております。
こんにちは。私も、ダウンロードした一人です。ダウンロードしたものの、パッチの当て方が分からず、頓挫しております。素人なもので、お恥ずかしい限りです。ググって調べた結果、パッチの作成方法は分かったのですが、当て方が良く分かりません。これって、どうやって使うのでしょうか。
katsumiさん、こんにちわ。
パッチの当て方ですがnucleusをインストールしたディレクトリ(config.phpと同じ階層)にパッチファイルを置いて、下記のコマンドを実行してみてください。
patch -p0 < ####.patch
コア改造していなければ特にエラーもなく終わると思います。
おかげさまで、うまく行ったようです。Windows環境下で試そうとしたので、patch.exeが必要で、そこが分かりませんでした。どうもありがとうございます。試してみます。
とりあえず、ローカルのNucleusに導入してみたら、うまく動きました。通常17回のクエリーが投げられるところ、5回のクエリーで動作しています。スピードの違いなど、見てみます。
ところでこれ、manager/cachemanager/で、ファイルの閲覧もしくはindexingを防ぐ何かが要りますね。.htaccess を入れておくか、あるいは新しいディレクトリを作成したときに、空のindex.html を必ず作るようにするか等です。
ところでこれ、manager/cachemanager/で、ファイルの閲覧もしくはindexingを防ぐ何かが要りますね。.
普段はmemcache版しか使っていないので気づいてませんでしたが、確かにそうですね。
一番いいのはCACHEMANAGER_DIRをウェブからアクセスできない場所にしてもらうということなんですが、ちょっと敷居が高いですよね。
キャッシュファイル自体の管理は完全にPEAR::Cache_Liteの領分なので、こちらに手を入れてもよいのであればindex.htmlを作るのもありですが、基本的には.htaccesなのかなと思っています。
藤咲です。最近サイトが重くSQLでの負荷が高いのではないかという疑念があるので、移転を行う前にCACHEMANAGER.phpを試してみたいと思ってます。3.31SP1用のパッチはありませんでしょうか?
また、レンタルサーバにて行う場合は一旦ローカルにファイルをダウンロードし、そこでパッチ実行後再アップという手順でいいのでしょうか。
別件ですがOpenIDのニックネームには日本語が使えないのですね。何で反映されないのかずっと悩んでました…。
3.31SP1用のパッチはありませんでしょうか?
すいません。まだ作っていません。ちょっと今月末までは忙しいので、来月になったら考えてみます。。。。
別件ですがOpenIDのニックネームには日本語が使えないのですね。何で反映されないのかずっと悩んでました…。
それはバグですね。。。。。。
ちょっと確認してみます。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。