有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

说明

云数据库 MongoDB 提供的不是简单的 mongod 访问,给到用户访问的是一个负载均衡 IP,此 IP 后面是连接到一系列类似 mongos 一样存在的路由接入层。 客户端驱动会透过负载均衡 IP 与接入机建立一个长连接,当此连接处于长期间活跃状态时,我们不会对其做任何干预,但是当长连接闲置时间超过1天时(此时间会随着版本优化而调整),路由接入层会剔除该连接。 一般来说,客户端驱动会实现一个自动重连的过程,但是也有部分语言的驱动并没有实现。对于没有实现自动重连的语言驱动,当用户使用一个已经被剔除的连接来尝试与云数据库 MongoDB 通信时可能会得到 “Remote server has closed the connection” 之类的错误信息,所以需手动进行重连,本文给出一个 PHP 重连的 demo。

基于 php mongo 驱动的重连实现

<?php

function getConnection() {
$connection = false;
$uri = 'mongodb://rwuser:1234567a@10.66.148.142:27017/admin?authMechanism=MONGODB-CR';
$maxRetries = 5;
for( $counts = 1; $counts <= $maxRetries; $counts++ ) {
try {
$connection = new MongoClient($uri);
} catch( Exception $e ) {
// 或者 根据需要使用下面的catch代码行,注意那一个“\\”,某些框架使用命名空间时需要用到。
// } catch( \\Exception $e ) {
continue;
}
break;
}
return $connection;
}

$connection = getConnection();

if($connection) {
$db = $connection->testdb;
$collection = $db->testcollection;

$one = $collection->findOne();

var_dump($one);
}