/** * 构造方法 * * @param array $options associative array of options * @throws RThink_Controller_Exception * @return void */ public function __construct(array $options = array()) { if (!extension_loaded('memcached')) { class_exists('RThink_Controller_Exception', false) || (require 'RThink/Controller/Exception.php'); throw new RThink_Controller_Exception('memcached扩展没有加载!'); } // override default client options $this->_options['client'] = array(Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT, Memcached::OPT_HASH => Memcached::HASH_MD5, Memcached::OPT_LIBKETAMA_COMPATIBLE => true); parent::__construct($options); if (isset($this->_options['servers'])) { $value = $this->_options['servers']; if (isset($value['host'])) { // in this case, $value seems to be a simple associative array (one server only) $value = array(0 => $value); // let's transform it into a classical array of associative arrays } $this->setOption('servers', $value); } $this->_memcache = new Memcached(); // 配置memcached客户端操作项 foreach ($this->_options['client'] as $name => $value) { $optId = null; if (is_int($name)) { $optId = $name; } else { $optConst = 'Memcached::OPT_' . strtoupper($name); if (defined($optConst)) { $optId = constant($optConst); } else { $this->_log("Unknown memcached client option '{$name}' ({$optConst})"); } } if ($optId) { if (!$this->_memcache->setOption($optId, $value)) { $this->_log("Setting memcached client option '{$optId}' failed"); } } } // 配置memcached服务 $servers = array(); foreach ($this->_options['servers'] as $server) { if (!array_key_exists('port', $server)) { $server['port'] = self::DEFAULT_PORT; } if (!array_key_exists('weight', $server)) { $server['weight'] = self::DEFAULT_WEIGHT; } $servers[] = array($server['host'], $server['port'], $server['weight']); } $this->_memcache->addServers($servers); }
/** * 构造方法 * * @param array $options associative array of options * @throws RThink_Controller_Exception * @return void */ public function __construct(array $options = array()) { if (!extension_loaded('memcache')) { class_exists('RThink_Controller_Exception', false) || (require 'RThink/Controller/Exception.php'); throw new RThink_Controller_Exception('memcache扩展没有加载!'); } parent::__construct($options); $this->_memcache = new Memcache(); //处理单台mecache服务器的参数的情况 if (isset($this->_options['servers'])) { $value = $this->_options['servers']; if (isset($value['host'])) { //单台服务器的情况 $value = array(0 => $value); // 构造memcache适配器需要的参数格式 } $this->setOption('servers', $value); } foreach ($this->_options['servers'] as $server) { array_key_exists('port', $server) || ($server['port'] = self::DEFAULT_PORT); array_key_exists('persistent', $server) || ($server['persistent'] = self::DEFAULT_PERSISTENT); array_key_exists('weight', $server) || ($server['weight'] = self::DEFAULT_WEIGHT); array_key_exists('timeout', $server) || ($server['timeout'] = self::DEFAULT_TIMEOUT); array_key_exists('retry_interval', $server) || ($server['retry_interval'] = self::DEFAULT_RETRY_INTERVAL); array_key_exists('status', $server) || ($server['status'] = self::DEFAULT_STATUS); array_key_exists('failure_callback', $server) || ($server['failure_callback'] = self::DEFAULT_FAILURE_CALLBACK); if ($this->_options['compatibility']) { $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], $server['weight'], $server['timeout'], $server['retry_interval']); } else { $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'], $server['weight'], $server['timeout'], $server['retry_interval'], $server['status'], $server['failure_callback']); } } }