2011-11-02 32 views
0

連接時沒有replicaSet例如爲:MongoDB的PHP replicaSet連接從來沒有關閉

new Mongo('mongodb://localhost'); 

一切正常,一旦他們走出去的範圍和連接到蒙戈總數坐在〜10接近偉大,連接蒙戈。

PRIMARY> db.serverStatus().connections; 
{ "current" : 6, "available" : 19994 } 

然而,當我指定replicaSet的連接從來沒有關閉,他們只是不停地堆積起來,只有當我重新啓動的php-fpm的過程結束。

new Mongo('mongodb://localhost', array("replicaSet" => "set")); 


PRIMARY> db.serverStatus().connections; 
{ "current" : 1298, "available" : 18702 } 

最奇怪的是,Mongo應該支持高達20000個連接。當我到達mongo的約700個連接時,FPM開始失敗。

我寫了一個小的抽象層(下面)來幫助調試問題,在兩個實例中調用close()並返回true。沒有例外拋出。有什麼想法嗎?我使用PHP 5.3.8-1 (fpm)php-mongo-driver v1.2.7 -

class MongoDBI { 
    private static $_db; 
    private static $_mongo; 
    private static $_instance; 

    private function __construct() { 
    try { 
     self::$_mongo = new Mongo(MONGODB_SERVER, array("replicaSet" => "set")); 
     self::$_db = self::$_mongo->selectDB(MONGODB_DATABASE); 
    } catch(MongoConnectionException $e) { 
     log("Unable to connect to Mongo: " . $e->getMessage() . "\n"); 
    } catch(Exception $e) { 
     log("Mongo: " . $e->getMessage() . "\n"); 
    } 
    } 

    public function __destruct() { 
    try { 
     $status = self::$_mongo->close(); 
     log("STATUS: " . $status . "\n"); 
    } catch(Exception $e) { 
     log("Mongo: " . $e->getMessage() . "\n"); 
    } 
    } 

    public static function getInstance() { 
    if(!isset(self::$_db)) 
     self::$_instance = new MongoDBI(); 

    return self::$_db; 
    } 
} 

編輯:rs.status();

PRIMARY> rs.status() 
{ 
    "set" : "somereplicaset", 
    "date" : ISODate("2011-11-02T20:33:14Z"), 
    "myState" : 1, 
    "members" : [ 
      { 
        "_id" : 0, 
        "name" : "node1:27017", 
        "health" : 1, 
        "state" : 1, 
        "stateStr" : "PRIMARY", 
        "optime" : { 
          "t" : 1320265677000, 
          "i" : 1 
        }, 
        "optimeDate" : ISODate("2011-11-02T20:27:57Z"), 
        "self" : true 
      }, 
      { 
        "_id" : 1, 
        "name" : "node2:27017", 
        "health" : 1, 
        "state" : 2, 
        "stateStr" : "SECONDARY", 
        "uptime" : 703192, 
        "optime" : { 
          "t" : 1320265677000, 
          "i" : 1 
        }, 
        "optimeDate" : ISODate("2011-11-02T20:27:57Z"), 
        "lastHeartbeat" : ISODate("2011-11-02T20:33:13Z"), 
        "pingMs" : 0 
      } 
    ], 
    "ok" : 1 
} 
+0

其他服務器在您的副本集中,並且PHP客戶端可以訪問它們嗎?或者對於初學者來說,'rs.status()'在mongo shell中爲你返回的是什麼? – dampier

+0

有兩臺服務器,我們可以稱它們爲node1和node2。連接時(「mongodb:// node1,node2」)是指定node1還是node1和node2都無關緊要。見上面的編輯顯示rs.status(); PHP顯示沒有連接到任何錯誤。 –

回答

1

原來這是mongo-php-driver v1.2.7中的一個錯誤,降級到1.2.6完全解決了這個問題。

+1

但我現在建議升級到1.4.x(最新) – Derick

+0

這是2歲。 –