使用PHP的Mongo扩展连接MongoDB。通过new Mongo对象建立数据库连接。

class Mongo {

public function __construct($servers,$options=array());

}

参数$server是PHP-MongoDB-Driver标准连接字符串格式

mongodb://[username:password@]host1[:port1][,host2[:port2:],…]/database

参数$options是一个数组。不同于标准MongoDB连接字符串,PHP-Mongo-Driver不将options拼接到连接字串中。

参数$options默认值:

$options =array(

'connect' => true

);

可选配置:

$options =array(

'connect' => true,// true表示Mongo构造函数中建立连接。

'timeout'=>xxxx,// 配置建立连接超时时间,单位是ms

'replicaSet'=>'name',// 配置replicaSet名称

'username'=>'',// 覆盖$server字符串中的username段,如果username包含冒号:时,选用此种方式。

'password'=>'',// 覆盖$server字符串中的password段,如果password包含符号@时,选用此种方式。

'db'=>'' // 覆盖$server字符串中的database段

);

登陆验证

MongoDB启动参数包含—auth或—keyFile时,想要执行数据库操作,需要先进行登陆验证。

你可以在连接字符串中知道用户名和密码进行登陆。

当连接关闭,驱动程序会自动尝试重新建立连接并且登陆。

$m =new Mongo("mongodb://${username}:${password}@localhost");

?>

当然也可以使用MongoDB::authenticate():方法进行登陆验证。

此方法登陆验证的数据库连接在失效后,仍会自动尝试建立连接,但不会自动尝试重新进行登陆验证。

$m =new Mongo();

$db =$m->admin;

$db->authenticate($username,$password);

?>

Replica Sets

指定一个或多个数据库服务器,且使用replicaSet选项连接。

$m =new Mongo(,array('replicaSet'=>'myReplicaSetName'));

?>

PHP-Mongo-Driver会查询在列出的数据库服务器中,到底哪个是主服务器。列出的服务器中包含master服务器才能成功建立连接。如 果无法连接到所有列出服务器或在这些服务器中没有找到master,将抛出MongoConnectionException异常。

当master出现异常,不能正常工作时,slaves会花一段时间来推选一台slave为新的master。在选举期间,连接到数据库的任何写操作将被禁止(除到slaves读操作不受影响)。

一旦master选举完成,驱动程序在读写操作时将主动探测谁是新master,然后将以此作为主库连接继续常规操作。

关于更多Replica Sets,可以参考http://www.mongodb.org/display/DOCS/Replication

支持Socket连接(Domain Socket Support)

如果在本地运行MongoDB,那么可以通过socket文件连接到MongoDB。MongoDB默认会自动打开一个本地socket文件:/tmp/mongodb- .sock。

如果你想通过socket进行验证登录需要显示指定port为0以表示socket文件位置描述的结束。

连接池(connection pool)

建立连接是Driver最费时的工作。即时网络良好,建立连接还是会花费数百毫秒。驱动程序建立了连接池增加连接复用,帮助你减少建立连接的开销。

当创建一个Mongo实例,所有需要的链接都将从连接池中获取(ReplicaSets模式下可能需要用到复数个连接,因为到每个成员都有一个连接)。

Mongo实例析构时,连接返回到连接池。PHP进程退出时会关闭连接池中所有的连接。

为什么我打开了那么多连接?

连接池可以保持大量的连接。事实上连接池确实保持了大量连接,我们来估算一下。

连接数和三方面有关:

connections_per_pool

理论上连接池对能保持连接数没有限制(直到耗尽文件句柄限制为止)。但实际应用中,使用完的连接将返回到连接池以便重复利用。在同一scope中新建新多个连接,这样就无法重复利用连接池了,这么做需要慎重。

通过MongoPool::info()函数可以查看当前使用的连接数。连接数的修改统计到”in use”和”in pool”两个域,分别表示使用中的连接数 和 空闲的连接数。

pools_per_process

对于每台MongoDB服务器地址都有自己的连接池。

例如通过”example.net”, “example.net:27017″, “localhost:27017″, “/tmp/mongodb-27017.sock”会对应生成3个连接池。详情参见MongoPool::info()。

processes

PHP进程间的连接池都是独立的。php-fpm和Apache一般会有N个php子进程。确认配置文件中设置的php-fpm最大子进程数。

使用PHP-FPM的情况,保险起见,以max_children和spare_servers+start_servers中较大者为最大处理子进程数,也就是最多有那么多组连接池。

估算最大的连接数,用上面三个变量相乘:

connections_per_pool*pools_per_process*processes

假设我们每个连接池有30个连接,每个PHP进程有10个连接池,总共有128个PHP进程。那么这台机器就有38400个连接。操作系统的最大文件句柄数限制要设置得足够高。

点击查看更多MongoPool信息。

长连接(Persistent Connections)

注:本节特性适用于1.2.0或以上版本。1.2.0+后,所有连接都是持久连接并且由连接池管理。

使用长连接的直接原因是效率高。因为连接复用而省去了大量的创建连接的开销。长连接由PHP进程维护。

举个简单的例子,写段程序连接1000次数据库:

for ($i=0;$i<1000;$i++) {

$m =new Mongo();

}

?>

这段代码执行了大约18秒。我们看看改用长连接的情况:

for ($i=0;$i<1000;$i++) {

$m =new Mongo("localhost:27017",array("persist" =>"x"));

}

?>

执行代码花费时间小于0.2秒,因为只建立了一个数据库连接。

建立长连接需要一个标识字串(如上例中的x)确保唯一性。需要复用一个长连接,域名、端口、标识字串、用户名和密码(如果有密码的话)都需要完全匹配。否则就会创建一个不同的长连接。

记得在生产环境中总是推荐使用长连接,除非你有强而有力的理由让你不那么做。这些理由多数和关系型数据库有关,而且和MongoDB没有半毛钱关系。

最佳实践:

强烈建议在新建Mongo对象时加上try/catch,因为如果连接失败时在输出的异常信息里会包含username/password对(php默认设置会显示异常和错误信息)。

try{

$m =new Mongo("mongodb://${username}:${password}@host");

}catch(Exception$e){

}

php mongodb长连接吗,PHP - MongoDB连接攻略相关推荐

  1. SQL Server 2005 Express 远程连接 客户端 远程访问 设置 全攻略 (适用 SQL Server 2005 其他版本)

    SQL Server 2005 Express 是微软提供的数据库的低端解决方案, 可免费任意随产品分发, 可以在XP等非专业服务器系统下安装, 还可以远程访问, 对于小型数据应用程序已足够满足数据使 ...

  2. csgo国服一直连不上服务器,csgo国服显示连接服务器发生错误 | 手游网游页游攻略大全...

    发布时间:2015-09-05 正当防卫3是刚出来的游戏呢,很多玩家都想要玩吧,但是由于这款游戏要全程联网才能够玩呢,很多玩家无法连接服务器,这是咋回事呢,下面看看正当防卫3无法连接服务器怎么办 总是 ...

  3. 怪物猎人世界取得服务器信息,steam怪物猎人世界无法连接更新服务器 | 手游网游页游攻略大全...

    发布时间:2016-03-04 街头霸王5无法连接到网络怎么办 无法连接更新服务器解决办法.无法连接到网络,无法连接更新服务器怎么办?近日玩家玩街霸5各种连不上服务器,下面给大家介绍解决方法,一起来看 ...

  4. 英雄连2显示无法连接服务器,英雄连2steam无法连接到更新服务器 | 手游网游页游攻略大全...

    发布时间:2016-06-25 街头霸王5无法连接到更新服务器?链接服务器错误解决办法,街头霸王5现在已经正式上市了,很多玩家在今天的游戏中发现无法连接到更新服务器,这是怎么回事呢,下面小编就为大家带 ...

  5. csgo账号连接服务器错误,steam csgo连接服务器发生错误 | 手游网游页游攻略大全...

    发布时间:2015-11-22 今天小编带来风暴英雄 进不去 从服务器下载数据时发生错误 怎么办 风暴英雄这个游戏看似是"MOBA"(DotA/DotA2)或者"Acti ...

  6. 无限恐怖大逃杀服务器链接失败,为什么吃鸡游戏买钥匙老是连接错误 | 手游网游页游攻略大全...

    发布时间:2015-12-30 这几天经常出毛病进不去,经常登录时提示网络连接错误,连接不上服务器,连接失败等等,这些问题相信小伙伴们都遇到过,甚至一直卡在登陆页面进不去,提示登陆失败,这可能是由于众 ...

  7. 最终幻想15显示服务器,最终幻想15无法连接到更新服务器啊 | 手游网游页游攻略大全...

    发布时间:2016-06-25 街头霸王5无法连接到更新服务器?链接服务器错误解决办法,街头霸王5现在已经正式上市了,很多玩家在今天的游戏中发现无法连接到更新服务器,这是怎么回事呢,下面小编就为大家带 ...

  8. 火影手游服务器响应超时,手游方舟为什么联机会显示连接超时 | 手游网游页游攻略大全...

    发布时间:2017-09-05 大话西游手游通风幻阵太虚镜怎么连接?魔王窟新增通风幻阵副本,相信很多玩家都还没哟摸清它的套路吧!下面小编就为大家详细介绍大话西游手游通风幻阵太虚镜的连接攻略. [流程与 ...

  9. 无限恐怖大逃杀服务器链接失败,第一次下吃鸡他显示无法连接更新服务器 | 手游网游页游攻略大全...

    发布时间:2016-03-04 街头霸王5无法连接到网络怎么办 无法连接更新服务器解决办法.无法连接到网络,无法连接更新服务器怎么办?近日玩家玩街霸5各种连不上服务器,下面给大家介绍解决方法,一起来看 ...

最新文章

  1. Web开发的机器学习框架
  2. shell编程入门步步高(八、函数)
  3. ginkgo测试介绍
  4. C语言 变量 函数 (类型、作用域、生命周期、存储位置)
  5. OS / 进程和线程的区别和联系
  6. react16中ref的使用
  7. Java 之 合成模式
  8. linux中特殊字符反引号,linux中的特殊符号$ ‘’ 反引号 反斜杠
  9. yjv是电缆还是电线_2019最新电缆载流量对照表,不用每次都百度了!
  10. Werkzeug Turorial
  11. 你需要的是持续的服务改进 1
  12. 如何在 Linux 上检查可用磁盘空间 [终端和 GUI]
  13. eclipse查看git地址_40个适用于Linux管理员和开发人员的git命令(上)
  14. 计算机加法器原理,加法器原理
  15. 朝圣—保罗· 柯艾略~随记2017-12-6周三
  16. 小米和联想的“骁龙”之争,首发第一,友谊第二
  17. 解决树莓派开机黑屏不显示桌面问题
  18. 手势估计- Hand Pose Estimation
  19. 这世界无非是“人人为我,我为人人”
  20. cmd 命令如何装逼 滚动屏幕

热门文章

  1. bat自动输入密码登录_【第7期】Teamcenter自动登录改进,对portal.bat中登录密码加密...
  2. 单片机C语言PWM程序原理,单片机C语言程序设计:用 ADC0808 控制 PWM 输出
  3. java cache缓存_Redis缓存失效策略思考
  4. HALCON 20.11:深度学习笔记(10)---分类
  5. android scrollow嵌套listview,excel 中IDEX和MATCH函数嵌套应用.doc
  6. hive --metastore三种模式
  7. 6、raid、lvm、while、until 学习笔记
  8. 如何让select选项的那个请选择不被选中
  9. 《Android游戏开发详解》一1.8 控制流程第2部分——while和for循环
  10. RDC升级(remote desktop service)