2017-05-04 69 views
0

我有以下代码,我想通过传递$ redisdb param连接到2个服务器。 不幸的是二审获得第一次联系。无法在PHP中实例化两次相同的类

$redis = new RedisHandler(); 
    $redis2 = new RedisHandler('redis2'); //this one gets first $redis connection 

我在做什么错?

class RedisHandler 
{ 
    static $db = null; 
    public function __construct($redisdb = 'redis') { 
     // opening db connection 
     return self::connect($redisdb); 
    } 
    static public function connect($redisdb) 
    { 
     global $config; 
     if (self::$db === null) 
     { 
      try { 
       $redisClient = new Redis(); 
       $redisClient -> connect($config[$redisdb]['host'], $config[$redisdb]['port'], $config[$redisdb]['timeout'], null, $config[$redisdb]['reservedInterval']); 
       $redisClient->setOption(Redis::OPT_READ_TIMEOUT, 100); 
       if (!$redisClient) { throw new Exception("Can't connect to Redis"); } 
      } catch (Exception $e) { 
       die('Failed to connect to Redis '.$e->getMessage()); 
      } 
      self::$db = $redisClient; 
      return self::$db; 
      //return $m; 
     } 
     else 
     { 
      // return self::$db; 
      return self::$db; 
     } 
    } 
} 
+1

那么,你是静态存储只有一个连接,没有太大的不同,从一个全局变量... – deceze

回答

0

RedisHandler类。如果连接已经存在,则返回现有的连接,因此,你所面临的问题Singleton模式,即开发。

您可以使用并关闭第一个连接,然后使用第二个连接解决问题。

+0

自我:: $ db保持连接全局?我怎么能不这样做? –

+0

是的,因为这不是使用实例化对象,即$ this。您可以完成第一个连接的任务,关闭它,然后创建第二个连接。 –

0

只要变量或函数成员与对象的当前实例无关,就会使用static关键字。

这里您

static $db 

是的RedisHandler每个实例相同。

首先instanciation $ DB是空,但在第二instanciation,因为$ DB是静态,变量不会,所以你不能实例化,因为的另一Redis的条件如果(self :: $ db === null)