why? i dunno… just because… just a toy…
no sql, no flat file, no write permissions required anywhere, no fuss
class mc_chat { var $chan = null; var $mc = null; var $ret = 5; function __construct($memcached, $channel, $retention=5) { $this->mc = $memcached; $this->chan = $channel; $this->ret = $retention; } function messages( $from=0 ) { $max = (int)$this->mc->get("$this->chan:max:posted"); $min = (int)$this->mc->get("$this->chan:min:posted"); $messages = array(); for ( $i=$min; $i< =$max; $i++ ) { if ( $i < $from ) continue; $m = $this->get($i); if ( $m['user'] && $m['message'] ) $messages[$i] = $m; } return $messages; } function get($id) { return array( 'user' =>(string)$this->mc->get("$this->chan:msg:$id:user"), 'message' => (string)$this->mc->get("$this->chan:msg:$id"), ); } function add($user, $message) { $id = (int)$this->mc->increment("$this->chan:max:posted"); if ( !$id ) { $id=1; $this->mc->set("$this->chan:max:posted", 1); } $this->mc->set("$this->chan:msg:$id:user", (string)$user); $this->mc->set("$this->chan:msg:$id", (string)$message); if ( $id >= $this->ret ) { if ( !$this->mc->increment("$this->chan:min:posted") ) $this->mc->set("$this->chan:min:posted", 1); } } } $mc = new Memcache; $mc->connect('localhost', 11211); $keep_messages = 10; $chatter_id = 1; $chat = new mc_chat($mc, 'chat-room-id', $keep_messages); $chat->add($chatter_id, date("r").": $chatter_id : foo"); $chat->messages(37); // messages only above id=37 $chat->messages(); // all the latest messages
Pretty slick. I was actually looking for something like this last week 😉
Really nice and simple implementation of a chat adapter 🙂 love it!