peclでは memcacheモジュール が有名どころでありますが、 memcachedモジュール ("d"が最後にくっついた)というものもあり、こちらは libmemcached をベースにしたモジュールとの事です。
memcachedモジュールは digg の中の人が作成されたモジュールとの事で、リリース後まだ1年ぐらいですが
get_multiをサポートなど今後の期待大のモジュールです。
ということで早速インストールしてみます。
libmemcached のインストール
http://tangent.org/552/libmemcached.html
libmemcached 本体をDLします。
現時点(2010.3.18)では0.38が最新版ですのでこれをDLします。
※CentOS4でのインストール時には、gccのバージョンが違うためでしょうか、make時にエラーになりました。この場合にはlibmemcachedのバージョンを落として利用しました。(今回は0.32に落としたら通りました)
wget http://download.tangent.org/libmemcached-0.38.tar.gz tar xvzf libmemcached-0.38.tar.gz cd libmemcached-0.38
32bit環境だとそのままのconfigureでエラーが発生するので、configure で若干の指定を追加します。
※こちらのBlog を参考にしました。
64bitの場合 (そのままで指定なし)
./configure
32bitの場合
./configure -disable-64bit CFLAGS="-O3 -march=i686"
make -> インストールします。
sudo make install
pecl memcached をインストール
以下から最新版のをDLします
※github版はこれですかね・・?
※memcached モジュールはdiggの中の人が作ったらしいです
pecl コマンドでインストール
一発でインストールです。楽ですね
sudo pecl install libmemcached
ソースからインストール
wget http://pecl.php.net/get/memcached-1.0.1.tgz tar xvzf http://pecl.php.net/get/memcached-1.0.1.tgz cd memcached-1.0.1 phpize ./configure make install
PHPに認識させる
/etc/php.ini に以下を追加します
[memcached] extension=memcached.so
mod_php でも認識させるため Apache(httpd)を再起動させます
sudo service httpd restart
確認する
phpinfoでmemcachedモジュールとlibmemcached のライブラリが認識されているか確認します
$ php -R ' phpinfo(); exit(); ' | grep memcached memcached memcached support => enabled libmemcached version => 0.38 Registered save handlers => files user sqlite memcached tokyo_tyrant
ブラウザ越しに mod_php での挙動も確認します
<?php phpinfo();
サンプルプログラム
弊社ではCacheクラスを作り、それをインスタンス化して利用しています。
コマンドラインでのスクリプト
きちんと実行されれば、 "hoge" と "array" をキーにした値が表示されると思います。
#!/bin/env php
<?php
ini_set('memory_limit','-1');
set_include_path(".");
include_once('./Proj_Cache.class.php');
define('MEMCACHED1_HOST','localhost');
define('MEMCACHED1_PORT','11211');
$cache = Proj_Cache::get_instance();
$cache->set('hoge','ほげ');
$cache->set('array',array(1,2,3,4,5,6,7,8,9,10));
var_dump($cache->get('hoge'));
var_dump($cache->get('array'));
Cacheクラス
<?php
class Proj_Cache {
private static $singleton;
private static $memcache;
private function __construct() {
$this->memcache = new Memcached();
$this->memcache->addServer(constant('MEMCACHED1_HOST'),constant('MEMCACHED1_PORT'),0.1);
if(defined('MEMCACHED2_HOST') && defined('MEMCACHED2_PORT')) {
$this->memcache->addServer(constant('MEMCACHED2_HOST'),constant('MEMCACHED2_PORT'),0.1);
}
}
public static function get_instance() {
if (!is_object(self::$singleton)) {
self::$singleton = new Proj_Cache();
}
return self::$singleton;
}
public function get ($key) {
// error_log("[ GET CACHE ] key:".$key);
$var = $this->memcache->get($key);
return $var;
}
public function set ($key,$value,$exp=60) {
//error_log("[ SET CACHE ] key:".$key." exp:".$exp);
$var = $this->memcache->set($key,$value,$exp);
return $var;
}
public function remove ($key) {
//error_log("[ REMOVE CACHE ] key:".$key);
$this->memcache->delete($key);
}
/* @throws RuntimeException */
public final function _clone() {
throw new RuntimeException ('Clone isn now allowd against '. get_class($this));
}
}
いかがでしょうか、ほとんど自分の覚え書きだったりもするのですが・・・
お役に立ちますと幸いです。
関連リンク
- pecl-memcached
- 新しいPHP用memcached拡張を diggが公開 PECLでバージョン0.1.0をリリース (codezine)
- libmemcachedライブラリ
- libmemcachedライブラリの configure 時のエラーへの対処法など
- PHPのワンライナープログラム(phpinfoなどの確認でこの方法を良く使っています)










