call_user_func_array
今天在整理redis用法的时候,遇到一个小问题,就是我们在调一些php-redis的时候,并不是所有的类都需要我们封装。
30,
//选择的数据库。
'db_id'=>0,
);
//什么时候重新建立连接
protected $expireTime;
protected $host;
protected $port;
public function __construct($config,$attr=array())
{
$this->attr = array_merge($this->attr,$attr);
$this->redis = new \Redis();
$this->port = $config['port'] ? $config['port'] : 6379;
$this->host = $config['host']? $config['port'] : '127.0.0.1';
$this->redis->connect($this->host, $this->port, $this->attr['timeout']);
if($config['auth'])
{
$this->auth($config['auth']);
$this->auth = $config['auth'];
}
$this->expireTime = time() + $this->attr['timeout'];
}
/**
* 得到实例化的对象.
* 为每个数据库建立一个连接
* 如果连接超时,将会重新建立一个连接
* @param array $config
* @param int $dbId
* @return \iphp\db\Redis
*/
public static function getInstance($config, $attr = array())
{
//如果是一个字符串,将其认为是数据库的ID号。以简化写法。
if(!is_array($attr))
{
$dbId = $attr;
$attr = array();
$attr['db_id'] = $dbId;
}
$attr['db_id'] = $attr['db_id'] ? $attr['db_id'] : 0;
$k = md5(implode('', $config).$attr['db_id']);
if(! (static::$_instance[$k] instanceof self))
{
static::$_instance[$k] = new self($config,$attr);
static::$_instance[$k]->k = $k;
static::$_instance[$k]->dbId = $attr['db_id'];
//如果不是0号库,选择一下数据库。
if($attr['db_id'] != 0){
static::$_instance[$k]->select($attr['db_id']);
}
}
elseif( time() > static::$_instance[$k]->expireTime)
{
static::$_instance[$k]->close();
static::$_instance[$k] = new self($config,$attr);
static::$_instance[$k]->k = $k;
static::$_instance[$k]->dbId= $attr['db_id'];
//如果不是0号库,选择一下数据库。
if($attr['db_id']!=0){
static::$_instance[$k]->select($attr['db_id']);
}
}
return static::$_instance[$k];
}
private function __clone(){}
/*****************hash表操作函数*******************/
/**
* 得到hash表中一个字段的值
* @param string $key 缓存key
* @param string $field 字段
* @return string|false
*/
public function hGet($key,$field)
{
return $this->redis->hGet($key,$field);
}
/**
* 为hash表设定一个字段的值
* @param string $key 缓存key
* @param string $field 字段
* @param string $value 值。
* @return bool
*/
public function hSet($key,$field,$value)
{
return $this->redis->hSet($key,$field,$value);
}
/**
* 判断hash表中,指定field是不是存在
* @param string $key 缓存key
* @param string $field 字段
* @return bool
*/
public function hExists($key,$field)
{
return $this->redis->hExists($key,$field);
}
/**
* 删除hash表中指定字段 ,支持批量删除
* @param string $key 缓存key
* @param string $field 字段
* @return int
*/
public function hdel($key,$field)
{
$fieldArr=explode(',',$field);
$delNum=0;
foreach($fieldArr as $row)
{
$row=trim($row);
$delNum+=$this->redis->hDel($key,$row);
}
return $delNum;
}
/**
* 返回hash表元素个数
* @param string $key 缓存key
* @return int|bool
*/
public function hLen($key)
{
return $this->redis->hLen($key);
}
> 然后在使用的时候
namespace app\test\controller;
use app\common\controller\Base;
use database\Redis as redis;
class Index extends Base
{
public function index(){
$redis = redis::getInstance();
}
}
> 像lSize,sLength这种,我就没必要封装了,用__call回调处理,通过call_user_func_array来传调用PHP-REDIS的方法
30,
//选择的数据库。
'db_id'=>0,
);
//什么时候重新建立连接
protected $expireTime;
protected $host;
protected $port;
public function __construct($config,$attr=array())
{
$this->attr = array_merge($this->attr,$attr);
$this->redis = new \Redis();
$this->port = $config['port'] ? $config['port'] : 6379;
$this->host = $config['host']? $config['port'] : '127.0.0.1';
$this->redis->connect($this->host, $this->port, $this->attr['timeout']);
if($config['auth'])
{
$this->auth($config['auth']);
$this->auth = $config['auth'];
}
$this->expireTime = time() + $this->attr['timeout'];
}
/**
* 得到实例化的对象.
* 为每个数据库建立一个连接
* 如果连接超时,将会重新建立一个连接
* @param array $config
* @param int $dbId
* @return \iphp\db\Redis
*/
public static function getInstance($config, $attr = array())
{
//如果是一个字符串,将其认为是数据库的ID号。以简化写法。
if(!is_array($attr))
{
$dbId = $attr;
$attr = array();
$attr['db_id'] = $dbId;
}
$attr['db_id'] = $attr['db_id'] ? $attr['db_id'] : 0;
$k = md5(implode('', $config).$attr['db_id']);
if(! (static::$_instance[$k] instanceof self))
{
static::$_instance[$k] = new self($config,$attr);
static::$_instance[$k]->k = $k;
static::$_instance[$k]->dbId = $attr['db_id'];
//如果不是0号库,选择一下数据库。
if($attr['db_id'] != 0){
static::$_instance[$k]->select($attr['db_id']);
}
}
elseif( time() > static::$_instance[$k]->expireTime)
{
static::$_instance[$k]->close();
static::$_instance[$k] = new self($config,$attr);
static::$_instance[$k]->k = $k;
static::$_instance[$k]->dbId= $attr['db_id'];
//如果不是0号库,选择一下数据库。
if($attr['db_id']!=0){
static::$_instance[$k]->select($attr['db_id']);
}
}
return static::$_instance[$k];
}
private function __clone(){}
/*****************hash表操作函数*******************/
/**
* 得到hash表中一个字段的值
* @param string $key 缓存key
* @param string $field 字段
* @return string|false
*/
public function hGet($key,$field)
{
return $this->redis->hGet($key,$field);
}
/**
* 为hash表设定一个字段的值
* @param string $key 缓存key
* @param string $field 字段
* @param string $value 值。
* @return bool
*/
public function hSet($key,$field,$value)
{
return $this->redis->hSet($key,$field,$value);
}
/**
* 判断hash表中,指定field是不是存在
* @param string $key 缓存key
* @param string $field 字段
* @return bool
*/
public function hExists($key,$field)
{
return $this->redis->hExists($key,$field);
}
/**
* 删除hash表中指定字段 ,支持批量删除
* @param string $key 缓存key
* @param string $field 字段
* @return int
*/
public function hdel($key,$field)
{
$fieldArr=explode(',',$field);
$delNum=0;
foreach($fieldArr as $row)
{
$row=trim($row);
$delNum+=$this->redis->hDel($key,$row);
}
return $delNum;
}
/**
* 返回hash表元素个数
* @param string $key 缓存key
* @return int|bool
*/
public function hLen($key)
{
return $this->redis->hLen($key);
}
/**
* [__call description]
* @Author Jerry
* @DateTime 2018-08-08T10:48:11+0800
* @Example eg:
* @param [type] $methodName [方法名]
* @param [type] $argument [参数]
* @return [type] [description]
*/
public function __call($methodName, $argument){
return call_user_func_array(array($this->redis, $methodName), $argument);
}