当前位置:首页 > PHP教程 > php应用 > 列表

php语言实现redis的客户端

发布:smiling 来源: PHP粉丝网  添加日期:2018-09-18 09:25:49 浏览: 评论:0 

为了更好的了解redis协议,我们用php来实现一个支持大部份命令的客户端类.

redis的协议可参考这个文章http://redis.cn/topics/protocol.html

代码如下:

  1. namespace xtgxiso; 
  2. class Redis { 
  3.     private $redis_socket = false; 
  4.     private $cmd = ''
  5.     public function __construct($host='127.0.0.1',$port=6379,$timeout = 3) { 
  6.         $this->redis_socket = stream_socket_client("tcp://".$host.":".$port$errno$errstr,  $timeout); 
  7.         if ( !$this->redis_socket) { 
  8.             throw new Exception("{$errno} - {$errstr}"); 
  9.         } 
  10.     } 
  11.     public function __destruct() { 
  12.         fclose($this->redis_socket); 
  13.     } 
  14.     public function __call($name$args) { 
  15.         $crlf = "\r\n"
  16.         array_unshift($args,$name); 
  17.         $command = '*' . count($args) . $crlf
  18.         foreach ($args as $arg) { 
  19.             $command .= '$' . strlen($arg) . $crlf . $arg . $crlf
  20.         } 
  21.         $fwrite = fwrite($this->redis_socket,$command); 
  22.         if ($fwrite === FALSE || $fwrite <= 0) { 
  23.             throw new Exception('Failed to write entire command to stream'); 
  24.         } 
  25.         return $this->readResponse(); 
  26.     } 
  27.     private function readResponse() { 
  28.         $reply = trim(fgets($this->redis_socket, 1024)); 
  29.         switch (substr($reply, 0, 1)) { 
  30.             case '-'
  31.                 throw new Exception(trim(substr($reply, 4))); 
  32.                 break
  33.             case '+'
  34.                 $response = substr(trim($reply), 1); 
  35.                 if ($response === 'OK') { 
  36.                     $response = TRUE; 
  37.                 } 
  38.                 break
  39.             case '$'
  40.                 $response = NULL; 
  41.                 if ($reply == '$-1') { 
  42.                     break
  43.                 } 
  44.                 $read = 0; 
  45.                 $size = intval(substr($reply, 1)); 
  46.                 if ($size > 0) { 
  47.                     do { 
  48.                         $block_size = ($size - $read) > 1024 ? 1024 : ($size - $read); 
  49.                         $r = fread($this->redis_socket, $block_size); 
  50.                         if ($r === FALSE) { 
  51.                             throw new Exception('Failed to read response from stream'); 
  52.                         } else { 
  53.                             $read += strlen($r); 
  54.                             $response .= $r
  55.                         } 
  56.                     } while ($read < $size); 
  57.                 } 
  58.                 fread($this->redis_socket, 2); /* discard crlf */ 
  59.                 break
  60.             /* Multi-bulk reply */ 
  61.             case '*'
  62.                 $count = intval(substr($reply, 1)); 
  63.                 if ($count == '-1') { 
  64.                     return NULL; 
  65.                 } 
  66.                 $response = array(); 
  67.                 for ($i = 0; $i < $count$i++) { 
  68.                     $response[] = $this->readResponse(); 
  69.                 } 
  70.                 break
  71.             /* Integer reply */ 
  72.             case ':'
  73.                 $response = intval(substr(trim($reply), 1)); 
  74.                 break
  75.             default
  76.                 throw new RedisException("Unknown response: {$reply}"); 
  77.                 break
  78.         } 
  79.         return $response
  80.     } 
  81. /* 
  82. $redis = new Client_test(); 
  83. var_dump($redis->auth("123456")); 
  84. var_dump($redis->set("xtgxiso",'abc')); 
  85. var_dump($redis->get("xtgxiso")); 
  86. */ 
通过实现,我们基本了解redis的协议。

Tags: php客户端 redis客户端

分享到: