1. class.php
<?php
namespace ybl;
class memcache
{
protected $config = array();
public $memcache_obj = '';
protected $host_list = '';
protected $connectfailures = 0;
public function __construct($config = array())
//默认配置
{
$this->config = array(
'host' => '127.0.0.1',
'port' => 11211,
'persistent' => false,
'weight' => 1,
//超时时间
'timeout' => 1,
//重试间隔时间
'retry_interval' => 15,
'status' => false,
//=============================
//是否打开压缩
'threshold' => 1,
//压缩率
'min_savings' => 0.2,
//最大重试次数
'max_connect_retries' => 5
);
//不带一致性hash分配方案
if (!isset($config['memcache_deploy']) || !is_callable($config['memcache_deploy'])) {
$config['memcache_deploy'] = array(
__class__,
'default_memcache_deploy'
);
}
//带一致性hash分配方案
if (!isset($config['memcache_hdeploy']) || !is_callable($config['memcache_hdeploy'])) {
$config['memcache_hdeploy'] = array(
__class__,
'default_memcache_hdeploy'
);
}
//错误处理
if (!isset($config['failure_callback']) || !is_callable($config['failure_callback'])) {
$config['failure_callback'] = array(
__class__,
'default_error_hander'
);
}
$this->config = array_merge($this->config, $config);
$this->memcache_obj = new \memcache;
}
public function host($host_list = '')
{
$this->host_list = $host_list;
return $this;
}
//默认错误处理
static public function default_error_hander($host = array())
//var_dump($host);
{
}
static public function default_memcache_hdeploy($host, $hash = '')
{
static $node_object;
if (!($node_object instanceof yhash)) {
$config = array(
//虚拟节点20个
'replicas' => 20
);
$node_object = new yhash($config);
//添加节点
$node_object->addtargets(array_keys($host));
}
return $node_object->lookup($hash);
}
static public function default_memcache_deploy($host)
{
$keys = array_keys($host);
$key = array_rand($keys, 1);
return $keys[$key];
}
public function alink()
{
$default_host = array(
'host' => $this->config['host'],
'port' => $this->config['port'],
'persistent' => $this->config['persistent'],
'weight' => $this->config['weight'],
'timeout' => $this->config['timeout'],
'retry_interval' => $this->config['retry_interval'],
'status' => $this->config['status'],
'failure_callback' => $this->config['failure_callback'],
'threshold' => $this->config['threshold'],
'min_savings' => $this->config['min_savings']
);
$failure_callback = '';
if (!empty($this->host_list)) {
foreach ($this->host_list as $_host) {
$_host = array_merge($default_host, $_host);
$failure_callback = function($host = '', $port = 11211) use ($_host)
{
return call_user_func_array($_host['failure_callback'], array(
$_host
));
};
$this->memcache_obj->addserver($_host['host'], $_host['port'], $_host['persistent'], $_host['weight'], $_host['timeout'], $_host['retry_interval'], $_host['status'], $failure_callback);
if ($_host['threshold']) {
$this->memcache_obj->setcompressthreshold($_host['threshold'], $_host['min_savings']);
}
}
} else {
$failure_callback = function($host = '', $port = 11211) use ($default_host)
{
return call_user_func_array($default_host['failure_callback'], array(
$default_host
));
};
$this->memcache_obj->addserver($default_host['host'], $default_host['port'], $default_host['persistent'], $default_host['weight'], $default_host['timeout'], $default_host['retry_interval'], $default_host['status'], $failure_callback);
if ($default_host['threshold']) {
$this->memcache_obj->setcompressthreshold($default_host['threshold'], $default_host['min_savings']);
}
}
}
public function link()
{
$default_host = '';
$host_no = -1;
$return = false;
$_host = array();
if (!empty($this->host_list)) {
$host_no = call_user_func_array($this->config['memcache_deploy'], array(
$this->host_list
));
$_host = $this->host_list[$host_no];
}
$default_host = array(
'host' => $this->config['host'],
'port' => $this->config['port'],
'persistent' => $this->config['persistent'],
//'weight'=>$this->config['weight'],
'timeout' => $this->config['timeout'],
'retry_interval' => $this->config['retry_interval'],
//'status'=>$this->config['status'],
'failure_callback' => $this->config['failure_callback'],
'threshold' => $this->config['threshold'],
'min_savings' => $this->config['min_savings']
);
$_host = array_merge($default_host, $_host);
if ($_host['persistent']) {
$return = @$this->memcache_obj->pconnect($_host['host'], $_host['port'], $_host['timeout']);
} else {
$return = @$this->memcache_obj->connect($_host['host'], $_host['port'], $_host['timeout']);
}
if (!$return) {
$this->connectfailures++;
if ($this->connectfailures <= $this->config['max_connect_retries']) {
if (count($this->host_list) > 1) {
call_user_func_array($_host['failure_callback'], array(
$_host
));
usleep($_host['interval_time']);
unset($this->host_list[$host_no]);
$this->link();
} else {
$this->connectfailures = 0;
call_user_func_array($_host['failure_callback'], array(
$_host
));
}
} else {
$this->connectfailures = 0;
call_user_func_array($_host['failure_callback'], array(
$_host
));
}
} else {
$this->connectfailures = 0;
if ($_host['threshold']) {
$this->memcache_obj->setcompressthreshold($_host['threshold'], $_host['min_savings']);
}
}
}
public function hlink($hash = '')
{
$default_host = '';
$host_no = -1;
$return = false;
$_host = array();
if (!empty($this->host_list)) {
$host_no = call_user_func_array($this->config['memcache_hdeploy'], array(
$this->host_list,
$hash
));
$_host = $this->host_list[$host_no];
}
$default_host = array(
'host' => $this->config['host'],
'port' => $this->config['port'],
'persistent' => $this->config['persistent'],
//'weight'=>$this->config['weight'],
'timeout' => $this->config['timeout'],
'retry_interval' => $this->config['retry_interval'],
//'status'=>$this->config['status'],
'failure_callback' => $this->config['failure_callback'],
'threshold' => $this->config['threshold'],
'min_savings' => $this->config['min_savings'],
'hash' => $hash
);
$_host = array_merge($default_host, $_host);
if ($_host['persistent']) {
$return = $this->memcache_obj->pconnect($_host['host'], $_host['port'], $_host['timeout']);
} else {
$return = $this->memcache_obj->connect($_host['host'], $_host['port'], $_host['timeout']);
}
if (!$return) {
$this->connectfailures = 0;
call_user_func_array($_host['failure_callback'], array(
$_host
));
} else {
if ($_host['threshold']) {
$this->memcache_obj->setcompressthreshold($_host['threshold'], $_host['min_savings']);
}
}
}
/*
type类型 值reset, malloc, maps, cachedump, slabs, items, sizes
slabid slab的id
limit 返回的最大条数
*/
public function _server($type = '', $slabid = 1, $limit = 1000000)
{
//$this->memcache_obj->close();
if ($type === '')
return $this->memcache_obj->getstats();
if ($type != 'cachedump')
return $this->memcache_obj->getstats($type);
return $this->memcache_obj->getstats($type, $slabid, $limit);
}
public function _allserver($type = '', $slabid = 1, $limit = 1000000)
{
if ($type === '')
return $this->memcache_obj->getextendedstats();
if ($type != 'cachedump')
return $this->memcache_obj->getextendedstats($type);
return $this->memcache_obj->getextendedstats($type, $slabid, $limit);
}
public function close()
{
return $this->memcache_obj->close();
}
public function slabid()
{
$ids = $id = array();
$ids = $this->memcache_obj->getstats('slabs');
foreach ($ids as $k => $v) {
if (is_int($k)) {
$id[] = $k;
}
}
return $id;
}
//!!!!!!!!!!!============================================
public function getallkey($limit = 1000000)
{
$ids = $this->slabid();
$arr = array();
foreach ($ids as $id) {
$arr = array_merge(array_keys($this->memcache_obj->getstats('cachedump', $id, $limit)), $arr);
}
return $arr;
}
public function set($key, $var, $expire = 0, $flag = memcache_compressed)
{
return $this->memcache_obj->set($key, $var, $flag, $expire);
}
public function add($key, $var, $expire = 0, $flag = memcache_compressed)
{
return $this->memcache_obj->add($key, $var, $flag, $expire);
}
public function get($key, &$flag = 0)
{
$gflag = 0;
$return = $this->memcache_obj->get($key, $gflag);
$flag = $gflag;
return $return;
}
public function delete($key, $timeout = 0)
{
if ($key === 'all') {
return $this->memcache_obj->flush();
}
return $this->memcache_obj->delete($key, $timeout);
}
public function replace($key, $var, $expire = 0, $flag = memcache_compressed)
{
return $this->memcache_obj->replace($key, $var, $flag, $expire);
}
public function increment($key, $var)
{
return $this->memcache_obj->increment($key, (int) $var);
}
public function decrement($key, $var)
{
return $this->memcache_obj->decrement($key, (int) $var);
}
public function append($key, $var, $expire = 0, $flag = memcache_compressed)
{
$return = $this->memcache_obj->get($key);
if (empty($return))
return false;
return $this->memcache_obj->replace($key, $return . $var, $flag, $expire);
}
public function prepend($key, $var, $expire = 0, $flag = memcache_compressed)
{
$return = $this->memcache_obj->get($key);
if (empty($return))
return false;
return $this->memcache_obj->replace($key, $var . $return, $flag, $expire);
}
public function cas($key, $key2)
{
$return1 = $this->memcache_obj->get($key);
if (empty($return1))
return false;
$return2 = $this->memcache_obj->get($key2);
if (empty($return2))
return false;
return ($this->memcache_obj->replace($key, $return2)) && ($this->memcache_obj->replace($key2, $return));
}
}
2. memcache.php
<?php
namespace ybl;
require_once('../lib/memcache/class.php');
//====================================================================================
//默认配置
$dconfig = array(
//主机
'host' => '127.0.0.1',
//端口
'port' => 11211,
//是否长连接
'persistent' => false,
//比重
'weight' => 1,
//超时时间
'timeout' => 1,
//重试间隔时间
'retry_interval' => 15,
//状态
'status' => false,
//=============================
//是否打开压缩
'threshold' => 1,
//压缩率
'min_savings' => 0.2,
//最大重试次数
'max_connect_retries' => 5,
//不带一致性hash分配方案
//回调函数
//参数 主机数组
'memcache_deploy' => 'default_memcache_deploy',
//带一致性hash分配方案
//回调函数
//参数 主机数组 hash值
'memcache_hdeploy' => 'default_memcache_hdeploy',
//错误处理
//回调函数
//参数 主机数组
'failure_callback' => 'default_error_hander'
);
//====================================================================================
//连接
/*memcahe 三种连接方式
1.连接池addserver
2.普通connect/pconnect
3.带hash的connect/pconnect
*/
//1.连接池
$memcache = new memcache();
$host = array(
array(
'host' => 'localhost',
'port' => '11211'
),
array(
'host' => '127.0.0.1',
'port' => '11211'
),
array(
'host' => 'localhost',
'port' => '11212'
),
array(
'host' => '127.0.0.1',
'port' => '11212'
)
);
$memcache->host($host);
$memcache->alink();
//print_r($memcache->_allserver());
//-------------------------------------------------------------
//2.普通connect/pconnect
$memcache2 = new memcache();
$host = array(
array(
'host' => 'localhost',
'port' => '11211'
),
array(
'host' => '127.0.0.1',
'port' => '11211'
),
array(
'host' => 'localhost',
'port' => '11212'
),
array(
'host' => '127.0.0.1',
'port' => '11212'
)
);
$memcache2->host($host);
$memcache2->link();
//print_r($memcache2->_allserver());
//--------------------------------------------------------------
//3.带hash的connect/pconnect
//导入算法类
include('../lib/hash/class.php');
$memcache3 = new memcache();
$host = array(
array(
'host' => 'localhost',
'port' => '11211'
),
array(
'host' => '127.0.0.1',
'port' => '11211'
),
array(
'host' => 'localhost',
'port' => '11211'
),
array(
'host' => '127.0.0.1',
'port' => '11211'
)
);
$memcache3->host($host);
//$memcache3->hlink('233ybl');
//print_r($memcache3->_allserver());
//==================================================================================
//内置函数
//set($key, $var, $expire = 0, $flag = memcache_compressed)
//add($key, $var, $expire = 0, $flag = memcache_compressed)
//get($key, &$flag = 0)
//delete($key, $timeout = 0)
//replace($key, $var, $expire = 0, $flag = memcache_compressed)
//increment($key, $var)
//decrement($key, $var)
//append($key, $var, $expire = 0, $flag = memcache_compressed)
//prepend($key, $var, $expire = 0, $flag = memcache_compressed)
// cas($key, $key2)
$memcache3->hlink('32ybl');
$memcache3->set('32ybl', 55);
//$memcache3->increment('32ybl',333);
echo $memcache3->get('32ybl');
//======================================================================
//系统函数
//获取当前连接服务器信息
//_server($type = '', $slabid = 1, $limit = 1000000)
//获取所有连接服务器信息
//_allserver($type = '', $slabid = 1, $limit = 1000000)
//获取所有key名
//getallkey($limit=1000000)
var_dump($memcache->getallkey());