| <?php | 
| /** | 
|  * PhalApi_Cache_Redis Redis缓存 | 
|  * | 
|  * - 使用序列化对需要存储的值进行转换,以提高速度 | 
|  * - 提供更多redis的操作,以供扩展类库使用 | 
|  * | 
|  * @package     PhalApi\Cache | 
|  * @license     http://www.phalapi.net/license GPL 协议 | 
|  * @link        http://www.phalapi.net/ | 
|  * @author      zzguo   2015-5-11 | 
|  * @modify      dogstar <chanzonghuang@gmail.com> 20150516 | 
|  */ | 
|   | 
| class PhalApi_Cache_Redis implements PhalApi_Cache { | 
|   | 
|     protected $redis; | 
|   | 
|     protected $auth; | 
|   | 
|     protected $prefix; | 
|   | 
|     /** | 
|      * @param string $config['type']    Redis连接方式 unix,http | 
|      * @param string $config['socket']  unix方式连接时,需要配置 | 
|      * @param string $config['host']    Redis域名 | 
|      * @param int    $config['port']    Redis端口,默认为6379 | 
|      * @param string $config['prefix']  Redis key prefix | 
|      * @param string $config['auth']    Redis 身份验证 | 
|      * @param int    $config['db']      Redis库,默认0 | 
|      * @param int    $config['timeout'] 连接超时时间,单位秒,默认300 | 
|      */ | 
|     public function __construct($config) { | 
|         $this->redis = new Redis(); | 
|   | 
|         // 连接 | 
|         if (isset($config['type']) && $config['type'] == 'unix') { | 
|             if (!isset($config['socket'])) { | 
|                 throw new PhalApi_Exception_InternalServerError(T('redis config key [socket] not found')); | 
|             } | 
|             $this->redis->connect($config['socket']); | 
|         } else { | 
|             $port = isset($config['port']) ? intval($config['port']) : 6379; | 
|             $timeout = isset($config['timeout']) ? intval($config['timeout']) : 300; | 
|             $this->redis->connect($config['host'], $port, $timeout); | 
|         } | 
|   | 
|         // 验证 | 
|         $this->auth = isset($config['auth']) ? $config['auth'] : ''; | 
|         if ($this->auth != '') { | 
|             $this->redis->auth($this->auth); | 
|         } | 
|   | 
|         // 选择 | 
|         $dbIndex = isset($config['db']) ? intval($config['db']) : 0; | 
|         $this->redis->select($dbIndex); | 
|   | 
|         $this->prefix = isset($config['prefix']) ? $config['prefix'] : 'phalapi:'; | 
|     } | 
|   | 
|     /** | 
|      * 将value 的值赋值给key,生存时间为expire秒 | 
|      */ | 
|     public function set($key, $value, $expire = 600) { | 
|         $this->redis->setex($this->formatKey($key), $expire, $this->formatValue($value)); | 
|     } | 
|   | 
|     public function get($key) { | 
|         $value = $this->redis->get($this->formatKey($key)); | 
|         return $value !== FALSE ? $this->unformatValue($value) : NULL; | 
|     } | 
|   | 
|     public function delete($key) { | 
|         return $this->redis->delete($this->formatKey($key)); | 
|     } | 
|   | 
|     /** | 
|      * 检测是否存在key,若不存在则赋值value | 
|      */ | 
|     public function setnx($key, $value) { | 
|         return $this->redis->setnx($this->formatKey($key), $this->formatValue($value)); | 
|     } | 
|   | 
|     public function lPush($key, $value) { | 
|         return $this->redis->lPush($this->formatKey($key), $this->formatValue($value)); | 
|     } | 
|   | 
|     public function rPush($key, $value) { | 
|         return $this->redis->rPush($this->formatKey($key), $this->formatValue($value)); | 
|     } | 
|   | 
|     public function lPop($key) { | 
|         $value = $this->redis->lPop($this->formatKey($key)); | 
|         return $value !== FALSE ? $this->unformatValue($value) : NULL; | 
|     } | 
|   | 
|     public function rPop($key) { | 
|         $value = $this->redis->rPop($this->formatKey($key)); | 
|         return $value !== FALSE ? $this->unformatValue($value) : NULL; | 
|     } | 
|   | 
|     protected function formatKey($key) { | 
|         return $this->prefix . $key; | 
|     } | 
|   | 
|     protected function formatValue($value) { | 
|         return @serialize($value); | 
|     } | 
|   | 
|     protected function unformatValue($value) { | 
|         return @unserialize($value); | 
|     } | 
| } |