From 3d38c39c17b9ebbd451029d92e9720bec4049f32 Mon Sep 17 00:00:00 2001 From: huangdijia Date: Fri, 29 Jan 2016 09:09:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E6=81=A2=E5=A4=8DMemcached=E9=A9=B1=E5=8A=A8=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85memcache=E9=A9=B1=E5=8A=A8=EF=BC=8C=E8=A7=A3=E5=86=B3w?= =?UTF-8?q?indows=E4=B8=8B=E6=B2=A1=E6=9C=89memcached=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/cache/driver/Memcache.php | 134 +++++++++++ library/think/cache/driver/Memcached.php | 267 +++++++++------------ library/think/session/driver/Memcache.php | 115 +++++++++ library/think/session/driver/Memcached.php | 232 +++++++----------- 4 files changed, 452 insertions(+), 296 deletions(-) create mode 100644 library/think/cache/driver/Memcache.php create mode 100644 library/think/session/driver/Memcache.php diff --git a/library/think/cache/driver/Memcache.php b/library/think/cache/driver/Memcache.php new file mode 100644 index 00000000..8ac18dd7 --- /dev/null +++ b/library/think/cache/driver/Memcache.php @@ -0,0 +1,134 @@ + +// +---------------------------------------------------------------------- + +namespace think\cache\driver; + +use think\Cache; +use think\Exception; + +class Memcache +{ + protected $handler = null; + protected $options = [ + 'host' => '127.0.0.1', + 'port' => 11211, + 'expire' => 0, + 'timeout' => 0, // 超时时间(单位:毫秒) + 'persistent' => true, + 'length' => 0, + ]; + + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options = []) + { + if (!extension_loaded('memcache')) { + throw new Exception('_NOT_SUPPERT_:memcache'); + } + if (!empty($options)) { + $this->options = array_merge($this->options, $options); + } + $this->handler = new \Memcache; + // 支持集群 + $hosts = explode(',', $this->options['host']); + $ports = explode(',', $this->options['port']); + if (empty($ports[0])) { + $ports[0] = 11211; + } + // 建立连接 + foreach ((array) $hosts as $i => $host) { + $port = isset($ports[$i]) ? $ports[$i] : $ports[0]; + $this->options['timeout'] > 0 ? + $this->handler->addServer($host, $port, $this->options['persistent'], 1) : + $this->handler->addServer($host, $port, $this->options['persistent'], 1, $this->options['timeout']); + } + } + + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) + { + Cache::$readTimes++; + return $this->handler->get($this->options['prefix'] . $name); + } + + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return bool + */ + public function set($name, $value, $expire = null) + { + Cache::$writeTimes++; + if (is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'] . $name; + if ($this->handler->set($name, $value, 0, $expire)) { + if ($this->options['length'] > 0) { + // 记录缓存队列 + $queue = $this->handler->get('__info__'); + if (!$queue) { + $queue = []; + } + if (false === array_search($name, $queue)) { + array_push($queue, $name); + } + + if (count($queue) > $this->options['length']) { + // 出列 + $key = array_shift($queue); + // 删除缓存 + $this->handler->delete($key); + } + $this->handler->set('__info__', $queue); + } + return true; + } + return false; + } + + /** + * 删除缓存 + * + * @param string $name 缓存变量名 + * @param bool|false $ttl + * + * @return bool + */ + public function rm($name, $ttl = false) + { + $name = $this->options['prefix'] . $name; + return false === $ttl ? + $this->handler->delete($name) : + $this->handler->delete($name, $ttl); + } + + /** + * 清除缓存 + * @access public + * @return bool + */ + public function clear() + { + return $this->handler->flush(); + } +} diff --git a/library/think/cache/driver/Memcached.php b/library/think/cache/driver/Memcached.php index ffc33180..ea4778d9 100644 --- a/library/think/cache/driver/Memcached.php +++ b/library/think/cache/driver/Memcached.php @@ -9,175 +9,128 @@ // | Author: liu21st // +---------------------------------------------------------------------- -namespace { - // 检测php环境 - if (!extension_loaded('memcached')) { - if (!extension_loaded('memcache')) { - throw new Exception('_NOT_SUPPERT_:memcache or memcachd'); - } - class Memcached extends Memcache - { - const OPT_CONNECT_TIMEOUT = 14; - private $timeout = 1000; +namespace think\cache\driver; - public function addServers(array $servers = []) - { - if (empty($servers)) { - return; - } +use think\Cache; +use think\Exception; - foreach ($servers as $key => $server) { - if (empty($server[0])) { - continue; - } +class Memcached +{ + protected $handler = null; + protected $options = [ + 'host' => '127.0.0.1', + 'port' => 11211, + 'expire' => 0, + 'timeout' => 0, // 超时时间(单位:毫秒) + 'length' => 0, + ]; - $this->addServer( - $server[0], - !empty($server[1]) ? $server[1] : 11211, - true, - !empty($server[2]) ? $server[1] : 1, - $this->timeout > 0 ? ($this->timeout / 1000) : 1 - ); - } - } - - public function setOption(int $option, mixed $value) - { - switch ($option) { - case self::OPT_CONNECT_TIMEOUT: - $this->timeout = $value; - break; - default: - break; - } - } - - public function set(string $key, mixed $value, $expiration = 0) - { - return $this->set($key, $value, MEMCACHE_COMPRESSED, $expiration); - } - } - } -} - -namespace think\cache\driver { - use think\Cache; - - class Memcached + /** + * 架构函数 + * @param array $options 缓存参数 + * @access public + */ + public function __construct($options = []) { - protected $handler = null; - protected $options = [ - 'host' => '127.0.0.1', - 'port' => 11211, - 'expire' => 0, - 'timeout' => 0, // 超时时间(单位:毫秒) - 'length' => 0, - ]; - - /** - * 架构函数 - * @param array $options 缓存参数 - * @access public - */ - public function __construct($options = []) - { - if (!empty($options)) { - $this->options = array_merge($this->options, $options); - } - $this->handler = new \Memcached; - // 设置连接超时时间(单位:毫秒) - if ($this->options['timeout'] > 0) { - $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->options['timeout']); - } - // 支持集群 - $hosts = explode(',', $this->options['host']); - $ports = explode(',', $this->options['port']); - if (empty($ports[0])) { - $ports[0] = 11211; - } - // 建立连接 - $servers = []; - foreach ((array) $hosts as $i => $host) { - $servers[] = [$host, (isset($ports[$i]) ? $ports[$i] : $ports[0]), 1]; - } - $this->handler->addServers($servers); + if (!extension_loaded('memcached')) { + throw new Exception('_NOT_SUPPERT_:memcached'); } - - /** - * 读取缓存 - * @access public - * @param string $name 缓存变量名 - * @return mixed - */ - public function get($name) - { - Cache::$readTimes++; - return $this->handler->get($this->options['prefix'] . $name); + if (!empty($options)) { + $this->options = array_merge($this->options, $options); } + $this->handler = new \Memcached; + // 设置连接超时时间(单位:毫秒) + if ($this->options['timeout'] > 0) { + $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->options['timeout']); + } + // 支持集群 + $hosts = explode(',', $this->options['host']); + $ports = explode(',', $this->options['port']); + if (empty($ports[0])) { + $ports[0] = 11211; + } + // 建立连接 + $servers = []; + foreach ((array) $hosts as $i => $host) { + $servers[] = [$host, (isset($ports[$i]) ? $ports[$i] : $ports[0]), 1]; + } + $this->handler->addServers($servers); + } - /** - * 写入缓存 - * @access public - * @param string $name 缓存变量名 - * @param mixed $value 存储数据 - * @param integer $expire 有效时间(秒) - * @return bool - */ - public function set($name, $value, $expire = null) - { - Cache::$writeTimes++; - if (is_null($expire)) { - $expire = $this->options['expire']; - } - $name = $this->options['prefix'] . $name; - if ($this->handler->set($name, $value, $expire)) { - if ($this->options['length'] > 0) { - // 记录缓存队列 - $queue = $this->handler->get('__info__'); - if (!$queue) { - $queue = []; - } - if (false === array_search($name, $queue)) { - array_push($queue, $name); - } + /** + * 读取缓存 + * @access public + * @param string $name 缓存变量名 + * @return mixed + */ + public function get($name) + { + Cache::$readTimes++; + return $this->handler->get($this->options['prefix'] . $name); + } - if (count($queue) > $this->options['length']) { - // 出列 - $key = array_shift($queue); - // 删除缓存 - $this->handler->delete($key); - } - $this->handler->set('__info__', $queue); + /** + * 写入缓存 + * @access public + * @param string $name 缓存变量名 + * @param mixed $value 存储数据 + * @param integer $expire 有效时间(秒) + * @return bool + */ + public function set($name, $value, $expire = null) + { + Cache::$writeTimes++; + if (is_null($expire)) { + $expire = $this->options['expire']; + } + $name = $this->options['prefix'] . $name; + if ($this->handler->set($name, $value, $expire)) { + if ($this->options['length'] > 0) { + // 记录缓存队列 + $queue = $this->handler->get('__info__'); + if (!$queue) { + $queue = []; } - return true; + if (false === array_search($name, $queue)) { + array_push($queue, $name); + } + + if (count($queue) > $this->options['length']) { + // 出列 + $key = array_shift($queue); + // 删除缓存 + $this->handler->delete($key); + } + $this->handler->set('__info__', $queue); } - return false; + return true; } + return false; + } - /** - * 删除缓存 - * - * @param string $name 缓存变量名 - * @param bool|false $ttl - * - * @return bool - */ - public function rm($name, $ttl = false) - { - $name = $this->options['prefix'] . $name; - return false === $ttl ? - $this->handler->delete($name) : - $this->handler->delete($name, $ttl); - } + /** + * 删除缓存 + * + * @param string $name 缓存变量名 + * @param bool|false $ttl + * + * @return bool + */ + public function rm($name, $ttl = false) + { + $name = $this->options['prefix'] . $name; + return false === $ttl ? + $this->handler->delete($name) : + $this->handler->delete($name, $ttl); + } - /** - * 清除缓存 - * @access public - * @return bool - */ - public function clear() - { - return $this->handler->flush(); - } + /** + * 清除缓存 + * @access public + * @return bool + */ + public function clear() + { + return $this->handler->flush(); } } diff --git a/library/think/session/driver/Memcache.php b/library/think/session/driver/Memcache.php new file mode 100644 index 00000000..d8058550 --- /dev/null +++ b/library/think/session/driver/Memcache.php @@ -0,0 +1,115 @@ + +// +---------------------------------------------------------------------- + +namespace think\session\driver; + +use SessionHandler; +use think\Exception; + +class Memcache extends SessionHandler +{ + protected $handler = null; + protected $config = [ + 'host' => '127.0.0.1', // memcache主机 + 'port' => 1121, // memcache端口 + 'expire' => 3600, // session有效期 + 'timeout' => 0, // 连接超时时间(单位:毫秒) + 'persistent' => true, // 长连接 + 'session_name' => '', // memcache key前缀 + ]; + + public function __construct($config = []) + { + $this->config = array_merge($this->config, $config); + } + + /** + * 打开Session + * @access public + * @param string $savePath + * @param mixed $sessName + */ + public function open($savePath, $sessName) + { + // 检测php环境 + if (!extension_loaded('memcache')) { + throw new Exception('_NOT_SUPPERT_:memcache'); + } + $this->handler = new \Memcache; + // 支持集群 + $hosts = explode(',', $this->config['host']); + $ports = explode(',', $this->config['port']); + if (empty($ports[0])) { + $ports[0] = 11211; + } + // 建立连接 + foreach ((array) $hosts as $i => $host) { + $port = isset($ports[$i]) ? $ports[$i] : $ports[0]; + $this->config['timeout'] > 0 ? + $this->handler->addServer($host, $port, $this->config['persistent'], 1) : + $this->handler->addServer($host, $port, $this->config['persistent'], 1, $this->config['timeout']); + } + return true; + } + + /** + * 关闭Session + * @access public + */ + public function close() + { + $this->gc(ini_get('session.gc_maxlifetime')); + $this->handler->close(); + $this->handler = null; + return true; + } + + /** + * 读取Session + * @access public + * @param string $sessID + */ + public function read($sessID) + { + return $this->handler->get($this->config['session_name'] . $sessID); + } + + /** + * 写入Session + * @access public + * @param string $sessID + * @param String $sessData + */ + public function write($sessID, $sessData) + { + return $this->handler->set($this->config['session_name'] . $sessID, $sessData, 0, $this->config['expire']); + } + + /** + * 删除Session + * @access public + * @param string $sessID + */ + public function destroy($sessID) + { + return $this->handler->delete($this->config['session_name'] . $sessID); + } + + /** + * Session 垃圾回收 + * @access public + * @param string $sessMaxLifeTime + */ + public function gc($sessMaxLifeTime) + { + return true; + } +} diff --git a/library/think/session/driver/Memcached.php b/library/think/session/driver/Memcached.php index 7d2445f7..bccfdda0 100644 --- a/library/think/session/driver/Memcached.php +++ b/library/think/session/driver/Memcached.php @@ -9,155 +9,109 @@ // | Author: liu21st // +---------------------------------------------------------------------- -namespace { - // 检测php环境 - if (!extension_loaded('memcached')) { - if (!extension_loaded('memcache')) { - throw new Exception('_NOT_SUPPERT_:memcache or memcached'); - } - class Memcached extends Memcache - { - const OPT_CONNECT_TIMEOUT = 14; - private $timeout = 1000; +namespace think\session\driver; - public function addServers(array $servers = []) - { - if (empty($servers)) { - return; - } +use SessionHandler; +use think\Exception; - foreach ($servers as $key => $server) { - if (empty($server[0])) { - continue; - } +class Memcached extends SessionHandler +{ + protected $handler = null; + protected $config = [ + 'host' => '127.0.0.1', // memcache主机 + 'port' => 1121, // memcache端口 + 'expire' => 3600, // session有效期 + 'timeout' => 0, // 连接超时时间(单位:毫秒) + 'session_name' => '', // memcache key前缀 + ]; - $this->addServer( - $server[0], - !empty($server[1]) ? $server[1] : 11211, - true, - !empty($server[2]) ? $server[1] : 1, - $this->timeout > 0 ? ($this->timeout / 1000) : 1 - ); - } - } - - public function setOption(int $option, mixed $value) - { - switch ($option) { - case self::OPT_CONNECT_TIMEOUT: - $this->timeout = $value; - break; - default: - break; - } - } - - public function set(string $key, mixed $value, $expiration = 0) - { - return $this->set($key, $value, MEMCACHE_COMPRESSED, $expiration); - } - } - } -} - -namespace think\session\driver { - use SessionHandler; - - class Memcached extends SessionHandler + public function __construct($config = []) { - protected $handler = null; - protected $config = [ - 'host' => '127.0.0.1', // memcache主机 - 'port' => 1121, // memcache端口 - 'expire' => 3600, // session有效期 - 'timeout' => 0, // 连接超时时间(单位:毫秒) - 'session_name' => '', // memcache key前缀 - ]; + $this->config = array_merge($this->config, $config); + } - public function __construct($config = []) - { - $this->config = array_merge($this->config, $config); + /** + * 打开Session + * @access public + * @param string $savePath + * @param mixed $sessName + */ + public function open($savePath, $sessName) + { + // 检测php环境 + if (!extension_loaded('memcached')) { + throw new Exception('_NOT_SUPPERT_:memcached'); } + $this->handler = new \Memcached; + // 设置连接超时时间(单位:毫秒) + if ($this->config['timeout'] > 0) { + $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->config['timeout']); + } + // 支持集群 + $hosts = explode(',', $this->config['host']); + $ports = explode(',', $this->config['port']); + if (empty($ports[0])) { + $ports[0] = 11211; + } + // 建立连接 + $servers = []; + foreach ((array) $hosts as $i => $host) { + $servers[] = [$host, (isset($ports[$i]) ? $ports[$i] : $ports[0]), 1]; + } + $this->handler->addServers($servers); + return true; + } - /** - * 打开Session - * @access public - * @param string $savePath - * @param mixed $sessName - */ - public function open($savePath, $sessName) - { - $this->handler = new \Memcached; - // 设置连接超时时间(单位:毫秒) - if ($this->config['timeout'] > 0) { - $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->config['timeout']); - } - // 支持集群 - $hosts = explode(',', $this->config['host']); - $ports = explode(',', $this->config['port']); - if (empty($ports[0])) { - $ports[0] = 11211; - } - // 建立连接 - $servers = []; - foreach ((array) $hosts as $i => $host) { - $servers[] = [$host, (isset($ports[$i]) ? $ports[$i] : $ports[0]), 1]; - } - $this->handler->addServers($servers); - return true; - } + /** + * 关闭Session + * @access public + */ + public function close() + { + $this->gc(ini_get('session.gc_maxlifetime')); + $this->handler->close(); + $this->handler = null; + return true; + } - /** - * 关闭Session - * @access public - */ - public function close() - { - $this->gc(ini_get('session.gc_maxlifetime')); - $this->handler->close(); - $this->handler = null; - return true; - } + /** + * 读取Session + * @access public + * @param string $sessID + */ + public function read($sessID) + { + return $this->handler->get($this->config['session_name'] . $sessID); + } - /** - * 读取Session - * @access public - * @param string $sessID - */ - public function read($sessID) - { - return $this->handler->get($this->config['session_name'] . $sessID); - } + /** + * 写入Session + * @access public + * @param string $sessID + * @param String $sessData + */ + public function write($sessID, $sessData) + { + return $this->handler->set($this->config['session_name'] . $sessID, $sessData, $this->config['expire']); + } - /** - * 写入Session - * @access public - * @param string $sessID - * @param String $sessData - */ - public function write($sessID, $sessData) - { - return $this->handler->set($this->config['session_name'] . $sessID, $sessData, $this->config['expire']); - } + /** + * 删除Session + * @access public + * @param string $sessID + */ + public function destroy($sessID) + { + return $this->handler->delete($this->config['session_name'] . $sessID); + } - /** - * 删除Session - * @access public - * @param string $sessID - */ - public function destroy($sessID) - { - return $this->handler->delete($this->config['session_name'] . $sessID); - } - - /** - * Session 垃圾回收 - * @access public - * @param string $sessMaxLifeTime - */ - public function gc($sessMaxLifeTime) - { - return true; - } + /** + * Session 垃圾回收 + * @access public + * @param string $sessMaxLifeTime + */ + public function gc($sessMaxLifeTime) + { + return true; } }