PHP - MongoDB连接攻略
http://blog.163.com/lgh_2002/blog/static/44017526201261111044608/
使用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时,想要执行数据库操作,需要先进行登陆验证。
你可以在连接字符串中知道用户名和密码进行登陆。
当连接关闭,驱动程序会自动尝试重新建立连接并且登陆。
当然也可以使用MongoDB::authenticate():方法进行登陆验证。
此方法登陆验证的数据库连接在失效后,仍会自动尝试建立连接,但不会自动尝试重新进行登陆验证。
<?php $m = new Mongo(); $db = $m ->admin; $db ->authenticate( $username , $password ); ?> |
Replica Sets
指定一个或多个数据库服务器,且使用replicaSet选项连接。
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次数据库:
<?php for ( $i =0; $i <1000; $i ++) { $m = new Mongo(); } ?> |
这段代码执行了大约18秒。我们看看改用长连接的情况:
<?php for ( $i =0; $i <1000; $i ++) { $m = new Mongo( "localhost:27017" , array ( "persist" => "x" )); } ?> |
执行代码花费时间小于0.2秒,因为只建立了一个数据库连接。
建立长连接需要一个标识字串(如上例中的x)确保唯一性。需要复用一个长连接,域名、端口、标识字串、用户名和密码(如果有密码的话)都需要完全匹配。否则就会创建一个不同的长连接。
记得在生产环境中总是推荐使用长连接,除非你有强而有力的理由让你不那么做。这些理由多数和关系型数据库有关,而且和MongoDB没有半毛钱关系。
最佳实践:
强烈建议在新建Mongo对象时加上try/catch,因为如果连接失败时在输出的异常信息里会包含username/password对(php默认设置会显示异常和错误信息)。
PHP - MongoDB连接攻略的更多相关文章
- 源码讲解 node+mongodb 建站攻略(一期)第二节
源码讲解 node+mongodb 建站攻略(一期)第二节 上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb. 代码http://www.imlwj.com/download/n ...
- php连接微软MSSQL(sql server)完全攻略
http://www.jb51.net/article/98364.htm php连接微软MSSQL(sql server)完全攻略 作者:吵吵 字体:[增加 减小] 类型:转载 时间:2016-11 ...
- 写给小前端er的nodejs,mongodb后端小攻略~ (windows系统~)
一.写在前面 迫于学校的压力,研二上准备回学校做实验发论文了,感觉真的没意思,这几天学着搞搞后端,踩了很多坑,整理一下这几天的坑以免以后再犯! 二.本文主要内容(由于是面向前端同学的,所以前端的内容就 ...
- 微信小游戏爆款秘笈 数据库MongoDB攻略篇
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度. ...
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- 生成 PDF 全攻略【2】在已有PDF上添加内容
项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...
- Java数组技巧攻略
Java数组技巧攻略 0. 声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...
- Moon.Orm3.8技术全攻略
Moon.ORM技术全攻略 一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...
随机推荐
- Sqlserver 按照时间段统计数据
WITH t1 ( [hour], title ) , ' 0:00:00--- 1:00:00' UNION ALL , ' 1:00:00--- 2:00:00' UNION ALL , ' 2: ...
- 使用c++实现一个FTP客户端(三)
接上篇:http://www.cnblogs.com/jzincnblogs/p/5217688.html,这篇主要记录编程过程中需要注意的地方以及遇到的一些问题及解决方法. 一.gethostbyn ...
- Winform工具栏ToolStrip和状态栏StatusStrip
工具栏和状态栏的设置与前面的菜单基本相似 1.ToolStrip 从工具栏选项卡上拖一个放入窗体即可,位置也是通过其Dock设置的.先上一张图,红色部分就是工具栏,工具栏中可以放置如图下拉菜单中的Bu ...
- 关于 unable to load shared object 'C:\Program Files\R\R-3.0.3\library\stats\libs\i386\stats.dll'
其实这个问题很简单就是,在R目录下的:C:\Program Files\R\R-3.0.3\library\stats\libs\i386这个目录下,拷贝一份:这个目录下的文件:C:\Program ...
- Spring Could 问题
作为流行的微服务框架,Spring Could实用但不完美,比如说它只针对Java语言,坚持REST协议做微服务间的通讯等. Spring Cloud虽然集成了众多组件,可以构建一个完整的微服务应用, ...
- 【转】ubuntu中没有/etc/inittab文件探究
原文网址:http://blog.csdn.net/gavinr/article/details/6584582 linux 启动时第一个进程是/sbin/init,其主要功能就是软件执行环境,包括系 ...
- java 面向对象 — 封装
- 【转】Java transient关键字使用小记
哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...
- HDU King (非连通图的差分约束,经典好题)
King Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 关于centos6升级python3.6无法使用pip的问题
用find / -name "pip",也找不到类似/usr/bin/pip类似的命令,说明pip没安装好,那么运行下面的命令 yum install python-pip 然后可 ...