金沙糖果派对网站app 10

1.3本子的PHP MongoDB
driver重写了连年管理库,和原先版本对照,在不舍日夜连接和连接池方面,都有了注重的变型。

  1. MongoDB的PHP驱动

 

1.2本子的接二连三管理

1.2本子的驱动引进了连接池,在实行此外查询时,都会从连接池中号召八个三番五次,完毕之后再归还给连接池。这里的做到是指装有该连接的变量离开了它的功效域,下边是一个演示。

最简易的版本:

<?php
$m = new MongoClient();    // ← 从连接池请求连接
$c = $m->demo->test;
$c->insert( array( 'test' => 'yes' ) );
?>

← $m离开功能域,连接归还给连接池

在函数中:

<?php
function doQuery()
{
        $m = new MongoClient();    // ← 从连接池请求连接
        $c = $m->demo->test;
        $c->insert( array( 'test' => 'yes' ) );
} // ← $m离开作用域,连接归还给连接池
?>

在有个别情况下,系统只怕会时有产生大批量的接连,譬如在ORMs/ODMs的某部复杂构造中援用连接对象,如下例子:

<?php
for ( $i = 0; $i < 5; $i++ )
{
        $conns[] = new MongoClient();
}// ← 现在有5个连接
?>

MongoDB在PHP驱动程序是多少个PHP扩展,在多方面阳台下都十分轻便安装。PHP5.1及以上版本的体系就能够了。

要拜见数据库,那么对拜会权限的装置是必需的!

1.3版本的接连管理

在1.3本子中,连接处理做了十分的大改观。各样worker进度(线程、PHP-FPM或Apache
worker卡塔尔国中,驱动把连接管理和Mongo*对象分别,减少驱动的复杂度。下边以单个节点的MongoDB实例来表明驱动如什么地点理连接。

当一个worker进度运维,MongoDB驱动会为之起先化连接微型机处理总是,何况暗中认可未有连接。

在率先个央求调用new
MongoClient(卡塔尔国;时,驱动创制二个新连接,而且以贰个哈希值标记这么些三番五次。那个哈希值富含以下参数:主机名、端口,进程ID和可选的replica
set名,假设是密码验证的接连几天,则还包含数据库名、客商名和密码的哈希值(对于密码验证的总是,大家前边再详尽研讨)。调用MongoClient::getConnections(卡塔尔(قطر‎方法,能够查看连接对应的哈希值:

<?php
$m = new MongoClient( 'mongodb://whisky:27017/' );
var_dump( $m->getConnections()[0]['hash'] );
?>

输出:

string(22) “whisky:27017;-;X;22835″

出口中的”-”表示该连接不归于有个别replica
set,”X”是一直不管一二客名、数据库和密码时的占位符,22835是当前历程的进度ID。

然后该连接会在连年微型机中注册: 金沙糖果派对网站app 1

在必要三番五次的别样时候,包涵插入、删除、更新、查找或推行命令,驱动都会向微机央求二个方便的接连来实行。央求连接时会用到new
MongoClient(卡塔尔的参数和当下进度的ID。每一种worker进程/线程,连接微电脑都会有二个连连列表,而各种PHP
worker同不常刻,只会运作二个须要,因而和各样MongoDB之间只需求一个总是,不断重用,直到PHP
worker终止或显式调用MongoClient::close(卡塔尔关闭连接。

先是查看phpinfo(卡塔尔(قطر‎的出口,鲜明运维的PHP版本和VC版本。这里VC版本能够简单地明白为PHP的编写翻译机制,假诺用的是Apache,则要求VC6,否则供给VC9,举个例子IIS。有些Zend用的VC8。还要小心是还是不是是线程安全的(Thread
Safety),对应到PHP的驱动包名中缩写为“ts”。同期要旗帜明显extension_dir的值,全体的扩充组件都放在这里处。

1、启用权限决定(-auth),当启用MongoDB数据库服务时,对参数的安装能够决定是不是启用权限决定
   不开启: mongod -dbpath=D:/MongoDB/Data
-logpath=D:/MongoDB/Log/test.log
    开启: mongod -dbpath=D:/MongoDB/Data
-logpath=D:/MongoDB/Log/test.log -auth

Replica sets

在存在复制集的景况中,情况有一些不均等。new
MongoClient(卡塔尔的连接字符串中,必要内定多少个hosts,并标示当前正值实用复制集:

$m = new
MongoClient(“mongodb://whisky:13000,whisky:13001/?replicaSet=seta”);

个中的replicaSet参数不可能大约,不然驱动会以为你是策动连接多个分裂的mongos进度。

在实例化时,驱动会检讨复制集的拓扑布局。下边例子的出口,显示在调用new
MongoClient(卡塔尔之后,复制集中具备可以知道的数目节点都会在微型机中登记三个连接:

<?php
$m = new MongoClient( 'mongodb://whisky:13001/?replicaSet=seta' );
foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], "\n";
}
?>

输出:

whisky:13001;seta;X;32315 whisky:13000;seta;X;32315

虽说连年字符串中绝非whisky:13000节点,可是微处理机中早就登记了四个三回九转:

金沙糖果派对网站app 2

微机不仅仅带有连接的哈希值和TCP/IP
socket,还保留哪个节点是主节点,以至种种节点的“间隔”。下边包车型地铁剧本彰显了那几个额外的新闻;

<?php
$m = new MongoClient( 'mongodb://whisky:13001/?replicaSet=seta' );
foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], ":\n",
        " - {$c['connection']['connection_type_desc']}, ",
        "{$c['connection']['ping_ms']} ms\n";
}
?>

输出:

whisky:13001;seta;X;5776: – SECONDARY, 1 ms whisky:13000;seta;X;5776:
– PRIMARY, 0 ms

使得把操作分为二种档案的次序:写操作,富含插入、更新、删除和下令;读操作,富含find和findOne。私下认可情形下,若无设置读偏幸参数,微电脑会平素再次回到主节点的接二连三。读偏幸参数能够由此setSlaveOkay(卡塔尔(قطر‎设置,也能够在一而再再而三字符串中安装:

$m = new MongoClient("mongodb://whisky:13000,whisky:13001/?replicaSet=seta&readPreference=secondaryPreferred");

增加这个参数后,连接字符串变得专程长,因而PHP驱动允许将精选放在数组中,作为第2个参数字传送入:

$options = array(
        'replicaSet' => 'seta',
        'readPreference' => 'secondaryPreferred',
);
$m = new MongoClient("mongodb://whisky:13000,whisky:13001/", $options);

对此每种操作,驱动向微机供给获取三个方便的三番五次。对于写操作,会一贯再次来到主节点的连天;对于读操作,要是扶持节点可用且“间隔”不远的话,则会回到该救助节点的连年。

2.
在Windows下安装PHP的MongoDB扩展

    由地点的两条开启服务的授命来看,是由运营命令mongod的参数
-auth决定,纵然不张开,那么对数据库都能够访谈。假若打开,那么就供给输入顾客名和密码(-auth(‘客商’,’密码’卡塔尔(قطر‎State of Qatar来进展授权,即使不易的则赶回1,不然再次来到0

表明的连年

若果MongoDB启用验证功用,那么连接的哈希值会蕴藏验证相关的哈希值。那样分裂脚本,使用不相同的客户名、密码连接同二个MongoDB上的比不上的数据库时,能够互为区分,而不会误用连接。上边示例使用admin客商名连接admin数据库,然后观看hash值的转换:

<?php
$m = new MongoClient( 'mongodb://admin:admin@whisky:27017/admin' );
var_dump( $m->getConnections()[0]['hash'] );
?>

输出:

string(64)
“whisky:27017;-;admin/admin/bda5cc70cd5c23f7ffa1fda978ecb class=”wp_keywordlink”>D30;8697″

早前示例中的”X”部分已经替换为一个满含数据库名admin、客户名admin和哈希值bda5cc70cd5c23f7ffa1fda978ecbd30,该哈希值是基于客商名、数据库名和密码哈希值总结得来。

为了印证能够科学事业,必要在连接字符串中包涵数据库名,不然会默认为admin。

在确立连接后要采用数据库,须求先选拔该数据库,如:

$collection = $m->demoDb->collection; $collection->findOne();

假定选取的数据库是连接字符串中钦点的数据库,恐怕一而再字符串中的数据库是admin,那么整个都会健康运营。不然,驱动会创立二个新的接连几日,进而防止验证被绕过,如下所示:

<?php
$m = new MongoClient( 'mongodb://user:user@whisky:27017/test' );

$db = $m->test2;
$collection = $db->collection;
var_dump( $collection->findOne() );
?>

输出:

Fatal error: Uncaught exception ‘MongoCursorException’ with message
‘whisky:27017: unauthorized db:test2 ns:test2.collection lock type:0
client:127.0.0.1′ in …/mongo-connect-5.php.txt:6

因为大家的三番两次并未执行test2数据库的授权验证,因此失利。假诺大家举行验证,就可以健康运作:

<?php
$m = new MongoClient( 'mongodb://user:user@whisky:27017/test' );

$db = $m->test2;
$db->authenticate('user2', 'user2' );
$collection = $db->collection;
$collection->findOne();

foreach ( $m->getConnections() as $c )
{
    echo $c['hash'], "\n";
}
?>

输出:

whisky:27017;-;test/user/602b672e2fdcda7b58a042aeeb034376;26983
whisky:27017;-;test2/user2/984b6b4fd6c33f49b73f026f8b47c0de;26983

金沙糖果派对2015cc,方今微机中有多个已表明的接连:

金沙糖果派对网站app 3

顺手提一句,如若您张开了E_DEPRECATED等级的荒诞提醒,则会看见:

Deprecated: Function MongoDB::authenticate() is deprecated in
…/mongo-connect-6.php.txt on line 5

使得提议通过创造三个MongoClient对象达成该类任务:

<?php
$mTest1 = new MongoClient( 'mongodb://user:user@whisky:27017/test', array( 'connect' => false ) );
$mTest2 = new MongoClient( 'mongodb://user2:user2@whisky:27017/test2', array( 'connect' => false ) );

$mTest1->test->test->findOne();
$mTest2->test2->test->findOne();

foreach ( $mTest2->getConnections() as $c )
{
    echo $c['hash'], "\n";
}
?>

单个MongoDB服务器能支撑的面世连接一定有限,假如使用PHP-FPM的话,各样worker进度有和好单身的连接池,那么超级轻易落成连接数的上限。因而,在生养情状中,不管有未有应用复制集,都要配备mongos,然后PHP-FPM连接mongos,这样能够减小mongod的连接数,况且PHP-FPM和mongos之间能够采纳短连接(即各类央求截止时都显式调用close函数关闭MongoDB连接卡塔尔。

到官方网址下载和PHP版本、VC版本和线程安全相匹配的包,解压后,将php_mongo.dll移动到extension_dir目录。

2、既然要输入顾客名和密码来进展授权,那么那一个客商名和密码是怎样来的啊?
  
私下认可情形下,数据库中是从未有过客户名和密码的,所以就是在张开服务时张开了权力决定,也是没有必要此外客商名和密码就足以访谈各个数据库。那也是必需的,因为大家要给数据库设置密码就非得要先能够访谈数据库,那时候就能够对大家的精品助理馆员某数据库管理员安装客户名和密码。

假使开发银行了应用服务器(Apache、WAMPP等),要求重启,下一次运转PHP时会自动加载Mongo扩大。

3、超级管理员和某数据库的领队
  
一级管理员正是在admin数据库中增加的客商名和密码(能够查阅数据库列表什么的….)
   某数据库管理员也正是对各样数据库增添顾客名和密码

  1. PHP驱动程序的简短示例

4、开首举办那么一下

Mongo类就是三个到数据库的连年。暗中认可境况下,构造器尝试连接当地暗中同意端口处运营的数据库服务器。MongoDB中的文书档案用PHP中的关联数组表示,{“foo”
: “bar”}对应PHP中的array(“foo” =>
“bar”卡塔尔国。MongoDB中的数组对应表示为PHP中的数组,[“foo”, “bar”,
“baz”]对此PHP中的array(“foo”, “bar”,
“baz”卡塔尔(قطر‎。对于null、布尔型、数字型、字符串和数组,PHP驱动使用了PHP的本机类型。对于别的门类,可参看手册。

  1. 金沙糖果派对网站app,张开服务(启用权限调控卡塔尔国
    mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log -auth
    金沙糖果派对网站app 4
  2. 暗许未有客户名和密码的动静下是能够访谈放肆数据库的
    金沙糖果派对网站app 5
  3. 在此此景况下,创立一个特级管理员
    输入:use admin
    输入:db.addUser(‘sa’,’123′)
    然后再拜望admin数据库试试,就能产出谬误提醒,那是便是因为急需顾客授权,当输入顾客名和密码来授权之后,就OK
    金沙糖果派对网站app 6
  4. 当时按Ctrl+C退出,然后再步向,用刚刚创办的客商去做客admin以外的数据库,举例:test
    用admin创建的极品管理员敬谢不敏直接待上访谈别的数据库,然而足以直接的去探访。
    金沙糖果派对网站app 7
  5. 运用一级助理馆员直接的去拜访放肆数据库,直接的去寻访正是先通过授权踏向admin数据库,然后再由admin数据库步入另外数据库
    即:以admin数据库为跳板,再走入其余数据库
    金沙糖果派对网站app 8
  6. 为数据库加多客商名和密码,每一种数据库都得以加上直接访谈此库的顾客和密码,何况是贮存在本库的system.users表中的
    为test数据库创造直接访问顾客:客户名=test     密码=123
    金沙糖果派对网站app 9
  7. 接轨第6步,按Ctrl+C退出,再度步向test数据库,并输入第6步中为test数据库创立的一贯访谈顾客和密码来展开授权
    金沙糖果派对网站app 10

    水到渠成….
    当时有未有对数据库的权能难点有了些通晓呢?

示例1:

 5、多少个大约的劳动安装、服务卸载以至顾客登入实例

赢得数据库test的users集结,不用忧郁users集合是不是存在,若不设有该集结,程序会在数据库中自行创设。如下:

  1. 安装:mongod -dbpath=D:/MongoDB/Data
  2. 安装:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log
  3. 安装:mongod -dbpath=D:/MonogDB/Data
    -logpath=D:/MongoDB/Log/test.log -logappend
  4. 安装:mongod -dbpath=D:/MonogDB/Data
    -logpath=D:/MongoDB/Log/test.log -logappend -fork
    卸载:db.shutdownServer()
    以上的cmd中的shell连接:mongo 或许mongo admin(内定的数据库名称State of Qatar
                          C#连接:mongodb://localhost
  5. 安装:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log  port 2222 -install
    开启:net start MongoDB
    关闭:net stop MongoDB
    卸载:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log  port 2222 -remove
    指令连接:mongo 127.0.0.1:2222或mongo
    127.0.0.1:2222/admin(即:数据库名称卡塔尔国
     c#连接:mongodb://127.0.0.1:2222或Server=127.0.0.1:2222
  6. 安装:mongod -dbpath=D:/MongoDB/Data
    -logpath=D:/MongoDB/Log/test.log  port 2222  -auth -install
    与5类似
    指令连接:
     
    c#三回九转:mongodb://顾客名:密码@localhost:2222   登陆后将私下认可使用admin数据库
              mongodb://客商名:密码@localhost:2222/admin(即:数据库名称卡塔尔

 

id=”articlecontent”>以下列出的uri样式并非被所有的数据库驱动所支持,请参考各驱动自己的文档,查看各驱动支持的连接字符串uri形式。如果下面的样式不支持,那么驱动会有自己的指定连接的替代方式。

id=”articlecontent”>mongodb:``//[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

id=”articlecontent”>mongodb:``// 是一个必填的前缀,它标识当前字符串是标准连接格式。
id=”articlecontent”>{{username:password@}}可选。给出用户名和密码后,驱动将在连接到数据库后尝试登录。host1 uri里唯一的必填项,数据库的连接地址。
:portX 可选。默认连接到27017端口。
id=”articlecontent”>/database 是希望连接到的数据库名,只有在提供 username:password@ 后该值才有效。如果不指定,默认将连接``"admin"``数据库。 id=”articlecontent”>可以任意指定多个数据库和端口,这用于实现连接到replica pairs/sets。可选项options有:
  connect=direct|replicaset
   id=”articlecontent”>direct: 直接建立一个到服务器的连接。如果指定了多个host,将按先后顺序挨个尝试建立连接,直到连接建立成功为止。如果只指定了一个host,则 direct 为默认值。
   id=”articlecontent”>replicaset: 使用creplica ``set semantics建立连接(即使只提供了一个host)。指定的host作为种子列表来查找完整的replica``set``。当指定多个host时 replicaset 为默认值。
  replicaset=name
   id=”articlecontent”>驱动验证建立连接的replica ``set``的名字。隐含 connect=replicaset。
   id=”articlecontent”>slaveok=``true``|``falseo     ``true``: 对于 connect=direct 模式,驱动对列表中的第一个服务器建立连接,即使它不是主服务器。对 connect=replicaset 模式,驱动将所有写操作发送到主节点,将所有读操作按round robin顺序分发到从节点。
   id=”articlecontent”>false``: 对 connect=direct 模式,驱动按顺序尝试所有host直到找到主节点。对 connect=replicaset 模式,驱动将只连接到主节点,并将所有读操作和写操作都发送到主节点。 id=”articlecontent”>safe=``true``|``false
  true: 驱动在历次换代操作后都发送 getlasterror
命令以管教更新成功(参谋 w 和 wtimeout)。
  false: 驱动每一次换代操作后不发送 getlasterror 命令。

   w=no   
  驱动给 getlasterror 发送 { w : n } 命令。隐含 safe=true。

   wtimeout=ms
  驱动给 getlasterror 添加 { wtimeout : ms } 参数。隐含
safe=true。

  fsync=true|false
  true: 驱动给 getlasterror 添加 { fsync : true } 参数。隐含
safe=true。
  false: 驱动不增加 fsync 参数。

 

连接示例

连接到一个运行在本机默认端口(27017)的MongoDB
mongodb://localhost
连接到一个运行在本机默认端口(27017)的MongoDB,并以用户名"fred"和密码"foobar"登录,登录后将默认使用admin数据库
mongodb://fred:foobar@localhost
连接到一个运行在本机默认端口(27017)的MongoDB,并以用户名"fred"和密码"foobar"登录,登录后将使用baz数据库
mongodb://fred:foobar@localhost/baz
连接到一个replica pair,一台服务器在example1.com,另一台在example2.com
mongodb://example1.com:27017,example2.com:27017
连接到本机的一个replica set(端口分别为27017,27018,27019)
mongodb://localhost,localhost:27018,localhost:27019
连接到三台服务器的replica set,将所有写操作发送到主节点,所有读操作分发到从节点
mongodb://host1,host2,host3/?slaveok=true
连接到第一台服务器并响应,无论它是replica set的一台,也无论它是主节点还是从节点
mongodb://host1,host2,host3/?connect=direct;slaveok=true
注:这种类型的连接字符串可用于在你偏好使用某台服务器但有可供替换的服务器的时候。
使用safe模式连接到本机
mongodb://localhost/?safe=true
使用safe模式连接到replica set,等待备份在至少两台机器上完成,timeout时间为2秒
mongodb://host1,host2,host3/?safe=true;w=2;wtimeout=2000

 

1 <?php  2   3          $connection = new Mongo();  4   5          $collection = $connection->test->users;  6   7 ?>

理之当然还足以持续访问子集合,比如获取users.addresses集结:

1 $collection = $connection->users->addresses;

小心:这里开创MongoDB的连接时,new
Mongo(卡塔尔国中从未传任何参数,那么私下认可连接到localhost:27017的MongoDB服务器上。假设要创建到某些主机的某部端口的连续几天,能够编写如下代码:

1 $connection = new Mongo(‘example.com’);    //连接到example.com:27017  2 $connection = new Mongo(‘example.com:65432‘);          //连接到example.com:65432

有人会不通常,如若MongoDB是以安全认证的建制运作的,那么怎么总是服务器呢?能够透过传播客户名和密码获取连接:

admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注