2017-05-04 29 views
0

次のコードがあり、$ redisdb paramを渡して2つのサーバーに接続したいとします。 不幸にも、2番目のインスタンスが最初に接続します。PHPで同じクラスを2回インスタンス化できません

$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

まあ、1つの接続だけを静的に格納していて、1つのグローバル変数と大きく異なるわけではありません... – deceze

答えて

0

RedisHandlerクラスはシングルトンパターン、すなわち接続が既に既存の接続が返される存在する場合は、このようにあなたが問題に直面している上で開発されています。

最初の接続を使用して終了し、2番目の接続を使用して問題を解決することができます。

+0

self :: $ dbは接続をグローバルに保持しますか?どうしたらいい? –

+0

はい、これはインスタンス化されたオブジェクト、つまり$ thisを使用していないためです。最初の接続のタスクを完了して閉じ、2番目の接続を作成できます。 –

0

変数または関数メンバが現在のオブジェクトのインスタンスと無関係である場合は常にstaticキーワードが使用されます。

ここにあなたの

static $db 

RedisHandlerのインスタンスごとに同じです。

まずインスタンス化$ DBはヌルですが、$ DBは静的であるので、あなたが別のRedisのをインスタンス化することはできませんように、第2インスタンス化で、変数が原因で、ヌルではありません条件if(self :: $ db === null)

関連する問題