[PHP] peclのmemcachedを使ってみる

2010年3 月18日  |  Written by matsumoto  |  under PHP Yahoo!ブックマークに登録    はてなブックマーク - [PHP] peclのmemcachedを使ってみる

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));
    }

}

いかがでしょうか、ほとんど自分の覚え書きだったりもするのですが・・・
お役に立ちますと幸いです。

関連リンク

現在コメントはありません | コメントの投稿はこちら

コメントを書き込む

コメント本文

※コメントのフォーム内で以下のタグがご利用いただけます
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

私はチーム・マイナス6%です