zoukankan      html  css  js  c++  java
  • PHP

    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时,想要执行数据库操作,需要先进行登陆验证。
    你可以在连接字符串中知道用户名和密码进行登陆。
    当连接关闭,驱动程序会自动尝试重新建立连接并且登陆。

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

    当然也可以使用MongoDB::authenticate():方法进行登陆验证。
    此方法登陆验证的数据库连接在失效后,仍会自动尝试建立连接,但不会自动尝试重新进行登陆验证。

    <?php
    $m = new Mongo();
    $db = $m->admin;
    $db->authenticate($username, $password);
    ?>

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

    <?php
    $m = new Mongo("mongodb://localhost:27017", 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。

    <?php
    ?>

    如果你想通过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默认设置会显示异常和错误信息)。

    try{
    $m = new Mongo("mongodb://${username}:${password}@host");
    }catch(Exception $e){
  • 相关阅读:
    Thymeleaf模板引擎语法
    kali更新软件源
    解决kali安装成功后没有声音的问题
    SSO的误区及建议
    关于 target="_blank"漏洞的分析
    好久没来了,平时一些笔记都记在印象笔记,长传一波
    BIOS基础
    CSRF的本质及防御
    linux下stricky
    CSRF与xss的区别
  • 原文地址:https://www.cnblogs.com/lykbk/p/dfgdfgdsfgdfg5464565465.html
Copyright © 2011-2022 走看看