連接時沒有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
}
其他服務器在您的副本集中,並且PHP客戶端可以訪問它們嗎?或者對於初學者來說,'rs.status()'在mongo shell中爲你返回的是什麼? – dampier
有兩臺服務器,我們可以稱它們爲node1和node2。連接時(「mongodb:// node1,node2」)是指定node1還是node1和node2都無關緊要。見上面的編輯顯示rs.status(); PHP顯示沒有連接到任何錯誤。 –