這是一個簡單的 memcached 聚合器類別,它在多個快取伺服器之間分配快取。如果伺服器發生故障,負載會自動重新分配。它使用持續連線。
建構函式接受一個陣列的陣列,每個內部陣列代表一個伺服器,具有 'server'(字串)屬性,它是 memcached 伺服器的 IP 位址或主機名稱,以及 'port'(整數)屬性,它是 memcached 在伺服器上執行的埠號。
除了 getStats() 和 getVersion() 之外,所有現有的 memcached API 函式都已實作,它們是伺服器特定的。
<?php
class MemcachedAggregator {
var $connections;
public function __construct($servers) {
$this->connections = array();
for ($i = 0, $n = count($servers); $i < $n; $i++) {
$server = $servers[$i];
$con = memcache_pconnect($server['host'], $server['port']);
if (!($con == false)) {
$this->connections[] = $con;
}
}
}
private function _getConForKey($key) {
$hashCode = 0;
for ($i = 0, $len = strlen($key); $i < $len; $i++) {
$hashCode = (int)(($hashCode*33)+ord($key[$i])) & 0x7fffffff;
}
if (($ns = count($this->connections)) > 0) {
return $this->connections[$hashCode%$ns];
}
return false;
}
public function debug($on_off) {
$result = false;
for ($i = 0; $i < count($connections); $i++) {
if ($this->connections[$i]->debug($on_off)) $result = true;
}
return $result;
}
public function flush() {
$result = false;
for ($i = 0; $i < count($connections); $i++) {
if ($this->connections[$i]->flush()) $result = true;
}
return $result;
}
public function get($key) {
if (is_array($key)) {
$dest = array();
foreach ($key as $subkey) {
$val = get($subkey);
if (!($val === false)) $dest[$subkey] = $val;
}
return $dest;
} else {
return $this->_getConForKey($key)->get($key);
}
}
public function set($key, $var, $compress=0, $expire=0) {
return $this->_getConForKey($key)->set($key, $var, $compress, $expire);
}
public function add($key, $var, $compress=0, $expire=0) {
return $this->_getConForKey($key)->add($key, $var, $compress, $expire);
}
public function replace($key, $var, $compress=0, $expire=0) {
return $this->_getConForKey($key)->replace
($key, $var, $compress, $expire);
}
public function delete($key, $timeout=0) {
return $this->_getConForKey($key)->delete($key, $timeout);
}
public function increment($key, $value=1) {
return $this->_getConForKey($key)->increment($key, $value);
}
public function decrement($key, $value=1) {
return $this->_getConForKey($key)->decrement($key, $value);
}
}
?>