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