[ステップアップ! CakePHP] キャッシュに memcached を使う
早くも蚊に刺されました nakamura です。きっとおいしそうなんでしょうねぇ。分かる分かる。
今日は CakePHP 連載の 7 回目!CakePHP のキャッシュをファイルではなく memcached に保存する方法を紹介します。
memcached って?
データやオブジェクトをメモリ上に保持する為のキャッシュサーバです。ファイルにキャッシュするよりも高速に動作し、PHP, Java, Perl 等を始めとするプログラミング言語や MySQL, PostgreSQL といった RDBMS など memcached を利用可能なクライアントアプリケーションはとても多岐に渡ります。
この辺りが詳しく解説してくれています。
memcached をインストールする
今回は CentOS-5.3 でのインストール手順です。memcached と pecl-memcache をインストールします。
残念ながら CentOS にはデフォルトで memcached パッケージが存在しません。ということでまずは、yum のリポジトリに rpmforge を追加します。以下のページにある rpmforge-release-******.rpm というファイルの中からお使いのマシンに合うファイルを適宜ダウンロードします。
今回は i386 アーキテクチャの一番新しいものを使用します。
wget http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
以下のコマンドで rpmfoge リポジトリを追加します。
rpm -ivh rpmforge-release-0.5.1-1.el5.rf.i386.rpm
以上でリポジトリの準備は完了です。実際に memcached と pecl-memcache をインストールしてみましょう。
yum install memcached php-pecl-memcache
ちなみに pecl-memcache は pecl コマンドでインストールする事も可能ですが、せっかく yum で入れられて楽なので僕は yum を使っています。依存関係等も特に問題はなさそうです。
以下のコマンドで memcached を起動、及び自動起動アプリケーションに追加します。
/etc/init.d/memcached start
chkconfig --level 2345 memcached on
また、pecl-memcache を Apache に読み込ませる為、Apache の再起動も行ってください。
/etc/init.d/httpd restart
以下のコマンドで memcached への接続確認ができます。
memcached-tool localhost
CakePHP の設定
ここまで来ればあとは簡単!CakePHP の設定ファイルを編集するだけです。編集するファイルは app/config/core.php です。
以下の要領で、ファイルにキャッシュする設定をコメントアウトし、memcached にキャッシュする設定を有効化してください。
// core.php の末尾辺り。
// ファイルにキャッシュする設定をコメントアウト。
// Cache::config("default", array("engine" => "File"));
// memcached にキャッシュする。
Cache::config("default", array(
"engine" => "Memcache",
"duration"=> 3600,
"probability"=> 100,
"prefix" => Inflector::slug(APP_DIR) . "_",
"servers" => array(
"127.0.0.1:11211"
),
"compress" => false,
));
各項目の説明は以下の通りです。
engine
[必須] キャッシュエンジン(保存先)を指定。
duration
[任意] キャッシュの生存期間を指定。デフォルト 3600 秒。
probability
[任意] 生存期間が過ぎた際に再生成される確立。デフォルト 100% 。
prefix
[任意] キャッシュ名に付与する接頭辞。デフォルトは定数 APP_DIR 。
servers
[任意] memcached サーバの接続情報。デフォルト 127.0.0.1:11211 。
compress
[任意] キャッシュの中身を圧縮するかどうか。デフォルト false 。
以上で作業は終了です。app/tmp/cache 以下のファイルを全て削除してみましょう。CakePHP にアクセスしてファイルが再生成されなければ成功です。
終わりに
パフォーマンス的には、、、よほどキャッシュをバリバリ活用していない限りそれ程の違いは感じられないかもしれません。ただ、キャッシュをクリアする際に memcached を再起動するだけで OK なのはとても楽チンです。せっかくだしもっとキャッシュ使いたいなぁ。