| 
<?php
/**
 *
 * Setup:
 *
 edit the singleton() metod
 and define the list of memcached servers in a 2-d array
 in the format
 array(
 array('192.168.0.1'=>'11211'),
 array('192.168.0.2'=>'11211'),
 );
 *
 *
 * Usage:
 *
 <?php
 //include the class name
 include ('memcache.class.php');
 
 //store the variable
 Cache::set('key','abc');
 
 //increment/decrement the integer value
 Cache::increment('key');
 Cache::decrement('key');
 
 //fetch the value by it's key
 echo Cache::get('key');
 
 
 //delete the data
 echo Cache::delete('key');
 
 //Clear the cache memory on all servers
 Cache::flush();
 
 ?>
 
 Cache::replace() and Cache::add are implemented also.
 
 More information can be obtained here:
 http://www.danga.com/memcached/
 http://www.php.net/memcache
 
 */
 
 /**
 * The class makes it easier to work with memcached servers and provides hints in the IDE like Zend Studio
 * @author Grigori Kochanov http://www.grik.net/
 * @version 1
 *
 */
 class Cache {
 /**
 * Resources of the opend memcached connections
 * @var array [memcache objects]
 */
 protected $mc_servers = array();
 /**
 * Quantity of servers used
 * @var int
 */
 protected $mc_servers_count;
 
 static $instance;
 
 /**
 * Singleton to call from all other functions
 */
 static function singleton(){
 //Write here where from to get the servers list from, like
 // global $servers
 $servers = _Config::$memcache_servers;
 
 self::$instance ||
 self::$instance = new Cache($servers);
 return self::$instance;
 }
 
 /**
 * Accepts the 2-d array with details of memcached servers
 *
 * @param array $servers
 */
 protected function __construct(array $servers){
 if (!$servers){
 trigger_error('No memcache servers to connect',E_USER_WARNING);
 }
 for ($i = 0, $n = count($servers); $i < $n; ++$i){
 ( $con = memcache_pconnect(key($servers[$i]), current($servers[$i])) )&&
 $this->mc_servers[] = $con;
 }
 $this->mc_servers_count = count($this->mc_servers);
 if (!$this->mc_servers_count){
 $this->mc_servers[0]=null;
 }
 }
 /**
 * Returns the resource for the memcache connection
 *
 * @param string $key
 * @return object memcache
 */
 protected function getMemcacheLink($key){
 if ( $this->mc_servers_count <2 ){
 //no servers choice
 return $this->mc_servers[0];
 }
 return $this->mc_servers[(crc32($key) & 0x7fffffff)%$this->mc_servers_count];
 }
 
 /**
 * Clear the cache
 *
 * @return void
 */
 static function flush() {
 $x = self::singleton()->mc_servers_count;
 for ($i = 0; $i < $x; ++$i){
 $a = self::singleton()->mc_servers[$i];
 self::singleton()->mc_servers[$i]->flush();
 }
 }
 
 /**
 * Returns the value stored in the memory by it's key
 *
 * @param string $key
 * @return mix
 */
 static function get($key) {
 return self::singleton()->getMemcacheLink($key)->get($key);
 }
 
 /**
 * Store the value in the memcache memory (overwrite if key exists)
 *
 * @param string $key
 * @param mix $var
 * @param bool $compress
 * @param int $expire (seconds before item expires)
 * @return bool
 */
 static function set($key, $var, $compress=0, $expire=0) {
 return self::singleton()->getMemcacheLink($key)->set($key, $var, $compress?MEMCACHE_COMPRESSED:null, $expire);
 }
 /**
 * Set the value in memcache if the value does not exist; returns FALSE if value exists
 *
 * @param sting $key
 * @param mix $var
 * @param bool $compress
 * @param int $expire
 * @return bool
 */
 static function add($key, $var, $compress=0, $expire=0) {
 return self::singleton()->getMemcacheLink($key)->add($key, $var, $compress?MEMCACHE_COMPRESSED:null, $expire);
 }
 
 /**
 * Replace an existing value
 *
 * @param string $key
 * @param mix $var
 * @param bool $compress
 * @param int $expire
 * @return bool
 */
 static function replace($key, $var, $compress=0, $expire=0) {
 return self::singleton()->getMemcacheLink($key)->replace($key, $var, $compress?MEMCACHE_COMPRESSED:null, $expire);
 }
 /**
 * Delete a record or set a timeout
 *
 * @param string $key
 * @param int $timeout
 * @return bool
 */
 static function delete($key, $timeout=0) {
 return self::singleton()->getMemcacheLink($key)->delete($key, $timeout);
 }
 /**
 * Increment an existing integer value
 *
 * @param string $key
 * @param mix $value
 * @return bool
 */
 static function increment($key, $value=1) {
 return self::singleton()->getMemcacheLink($key)->increment($key, $value);
 }
 
 /**
 * Decrement an existing value
 *
 * @param string $key
 * @param mix $value
 * @return bool
 */
 static function decrement($key, $value=1) {
 return self::singleton()->getMemcacheLink($key)->decrement($key, $value);
 }
 
 
 //class end
 }
 
 ?>
 |