Memcacheのラッパーを作ってみた

昨年末にパフォーマンス対策にPHP、Memcacheを導入した時のメモ。
とりあえず、要件はstaticメソッドで簡単呼び出し、セット、ゲット出来ればOKということで。
#ちなみに、session.save_handlerはmemcacheなので、デーモン、PECL共にインストール済みです。

キャッシュ許容量の確認

$ less /etc/sysconfig/memcached

PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="1024"

アクセスラッパーの実装。
ケルト

<?php
class MemcacheHandler{

    /**
     * memcacheデーモン接続
     */
    static private function connect( $hosts, $port = 11211 ){
    }
    /**
     * ゲット
     */
    static public function get( $key ){
    }
    /**
     * セット
     */
    static public function set( $key, $value, $expire = 0, $compressed = 0 ){
    }
}
?>

実装していきます。

<?php
    static private $memcache = null;

    /**
     * memcacheデーモン接続
     */
    static private function connect( $hosts, $port = 11211 )
    {
        $memcache = new Memcache();
        if( ! is_array( $hosts ) )
        {
            $hosts = array( $hosts );
        }
        foreach( $hosts as $address )
        {
            $ret = $memcache->addServer( $address, $port );
        }
        self::$memcache = $memcache;
    }
?>

引数$hostsのmemcacheサーバをストアしていきます。接続インスタンスは静的メンバへ保存。
あとは、set、getの実装。

<?php
    static private $hosts = array(
        "host1","host2",
    );

    /**
     * 取得
     */
    static public function get( $key )
    {
        if( null == self::$memcache ){
            self::connect( self::$hosts );
        }
        return self::$memcache->get( $key );
    }
    /**
     * セット
     */
    static public function set( $key, $value, $expire = 0, $compressed = 0 )
    {
        if( null == self::$memcache ){
            self::connect( self::$hosts );
        }
        $ret = self::$memcache->set( $key, $value, $compressed, $expire );
    }
?>

各メソッドの処理前に、接続インスタンスがなければ、static private $hostsへ接続します。
setの引数の順序を変更したのは、個人的な好みです。。。

使用してみる。

<?php
include("MemcacheHandler.php");

MemcacheHandler::set( "key", "value" );
// value
echo MemcacheHandler::get( "key" );
?>

とりあえず、呼び出し1行でset、getすることが出来ました!
MemcacheHandler.php