From 635182dda2ae0916a271cd49bc35e10f07715a17 Mon Sep 17 00:00:00 2001 From: huangdijia Date: Thu, 28 Jan 2016 17:51:42 +0800 Subject: [PATCH] =?UTF-8?q?memcached=E4=B8=8D=E5=AD=98=E5=9C=A8=E6=97=B6?= =?UTF-8?q?=E6=A3=80=E6=B5=8Bmemcache=EF=BC=8C=E8=A7=A3=E5=86=B3windows?= =?UTF-8?q?=E6=B2=A1=E6=9C=89memcached.dll=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/Memcached.php | 280 ++++++++++++--------- library/think/session/driver/Memcached.php | 246 ++++++++++-------- 2 files changed, 304 insertions(+), 222 deletions(-) diff --git a/library/think/cache/driver/Memcached.php b/library/think/cache/driver/Memcached.php index ea4778d9..db80c45e 100644 --- a/library/think/cache/driver/Memcached.php +++ b/library/think/cache/driver/Memcached.php @@ -9,128 +9,170 @@ // | Author: liu21st // +---------------------------------------------------------------------- -namespace think\cache\driver; +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; -use think\Cache; -use think\Exception; - -class Memcached -{ - 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 (!extension_loaded('memcached')) { - throw new Exception('_NOT_SUPPERT_:memcached'); - } - 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 缓存变量名 - * @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, $expire)) { - if ($this->options['length'] > 0) { - // 记录缓存队列 - $queue = $this->handler->get('__info__'); - if (!$queue) { - $queue = []; + public function addServers(array $servers = []) + { + if(empty($servers)) return; + foreach ($servers as $key => $server) { + if (empty($server[0])) continue; + $this->addServer( + $server[0], + !empty($server[1]) ? $server[1] : 11211, + true, + !empty($server[2]) ? $server[1] : 1, + $this->timeout > 0 ? ($this->timeout/1000) : 1 + ); } - 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; + + 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); + } } - 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(); } } + +namespace think\cache\driver { + use think\Cache; + use think\Exception; + + class Memcached + { + 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); + } + + /** + * 读取缓存 + * @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, $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(); + } + } +} \ No newline at end of file diff --git a/library/think/session/driver/Memcached.php b/library/think/session/driver/Memcached.php index bccfdda0..dc922ac7 100644 --- a/library/think/session/driver/Memcached.php +++ b/library/think/session/driver/Memcached.php @@ -8,110 +8,150 @@ // +---------------------------------------------------------------------- // | Author: liu21st // +---------------------------------------------------------------------- - -namespace think\session\driver; - -use SessionHandler; -use think\Exception; - -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前缀 - ]; - - 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'); +namespace { + // 检测php环境 + if (!extension_loaded('memcached')) { + if (!extension_loaded('memcache')) { + throw new Exception('_NOT_SUPPERT_:memcache or memcached'); } - $this->handler = new \Memcached; - // 设置连接超时时间(单位:毫秒) - if ($this->config['timeout'] > 0) { - $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->config['timeout']); + class Memcached extends Memcache + { + const OPT_CONNECT_TIMEOUT = 14; + private $timeout = 1000; + + public function addServers(array $servers = []) + { + if(empty($servers)) return; + foreach ($servers as $key => $server) { + if (empty($server[0])) continue; + $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); + } } - // 支持集群 - $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 - * @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 - */ - 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; } } + +namespace think\session\driver { + use SessionHandler; + use think\Exception; + + 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前缀 + ]; + + 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) + { + $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 + * @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 + */ + 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; + } + } +} \ No newline at end of file