/** * 获取一个实例 * @return instance */ protected function __instance() { // 获取一个服务端节点地址 $address = AddressManager::getOneAddress($this->serviceName); list($ip, $port) = explode(':', $address); // Transport $socket = new \Thrift\Transport\TSocket($ip, $port); $transport_name = ThriftClient::getTransport($this->serviceName); $transport = new $transport_name($socket); // Protocol $protocol_name = ThriftClient::getProtocol($this->serviceName); $protocol = new $protocol_name($transport); try { $transport->open(); } catch (\Exception $e) { // 无法连上,则踢掉这个地址 AddressManager::kickAddress($address); throw $e; } // 客户端类名称 $class_name = "\\Services\\" . $this->serviceName . "\\" . $this->serviceName . "Client"; // 类不存在则尝试加载 if (!class_exists($class_name)) { $service_dir = $this->includeFile(); if (!class_exists($class_name)) { throw new \Exception("Class {$class_name} not found in directory {$service_dir}"); } } // 初始化一个实例 return new $class_name($protocol); }
/** * 获取一个实例 * @return instance */ protected function __instance() { // 获取一个服务端节点地址 $address = AddressManager::getOneAddress($this->serviceName); list($ip, $port) = explode(':', $address); // Transport $socket = new \Thrift\Transport\TSocket($ip, $port); //timeout config $socket->setSendTimeout($this->sendTimeout); $socket->setRecvTimeout($this->recvTimeout); $transport_name = ThriftClient::getTransport($this->serviceName); $transport = new $transport_name($socket); // Protocol $protocol_name = ThriftClient::getProtocol($this->serviceName); $protocol = new $protocol_name($transport); try { $transport->open(); } catch (\Exception $e) { // 无法连上,则踢掉这个地址 AddressManager::kickAddress($address); throw $e; } // 客户端类名称 $class_name = ThriftClient::getServiceDir($this->serviceName); // 类不存在则报出异常 if (!class_exists($class_name)) { throw new \Exception("Class {$class_name} not found in directory {$service_dir}"); } // 初始化一个实例 return new $class_name($protocol); }
return true; } /** * 释放锁 * @return bool */ public static function releaseMutex() { ($fd = self::getSemFd()) && sem_release($fd); return true; } } // ================ 以下是测试代码 ====================== if (PHP_SAPI == 'cli' && isset($argv[0]) && $argv[0] == basename(__FILE__)) { AddressManager::config(array('HelloWorld' => array('127.0.0.1:9090', '127.0.0.2:9090', '127.0.0.3:9090'), 'HelloWorldService' => array('127.0.0.4:9090'))); echo "\n剔除address 127.0.0.1:9090 127.0.0.2:9090,放入故障address列表\n"; AddressManager::kickAddress('127.0.0.1:9090'); AddressManager::kickAddress('127.0.0.2:9090'); echo "\n打印故障address列表\n"; var_export(AddressManager::getBadAddressList()); echo "\n获取HelloWorld服务的一个可用address\n"; var_export(AddressManager::getOneAddress('HelloWorld')); echo "\n恢复address 127.0.0.2:9090\n"; var_export(AddressManager::recoverAddress('127.0.0.2:9090')); echo "\n打印故障address列表\n"; var_export(AddressManager::getBadAddressList()); echo "\n配置有更改,md5会改变,则故障address列表自动清空\n"; AddressManager::config(array('HelloWorld' => array('127.0.0.2:9090', '127.0.0.3:9090'))); echo "\n打印故障address列表\n"; var_export(AddressManager::getBadAddressList()); }