PHP连接MongoDB
php连接MongoDB需要安装拓展包有两种,分别是mongo.so和mongodb.so,mongo.so比较老(最新版本是2017.9.5的,目前已停止更新),主要用于php5.x版本,两个拓展包都可以在pecl网站(https://pecl.php.net)下载
下载mongodb拓展包:
[root@linux ~]# cd /usr/local/src/
[root@linux src]# wget https://pecl.php.net/get/mongodb-1.6.1.tgz
解压:
[root@linux src]# tar -zxvf mongodb-1.6.1.tgz
生成configure文件:
[root@linux src]# cd mongodb-1.6.1/
[root@linux mongodb-1.6.1]# /usr/local/php-fpm/bin/phpize
配置编译参数:
[root@linux mongodb-1.6.1]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
编译安装:
[root@linux mongodb-1.6.1]# make && make install
修改php配置文件:
[root@linux mongodb-1.6.1]# vim /usr/local/php-fpm/etc/php.ini
添加以下内容:
extension=mongodb.so
检查拓展模块是否被加载:
[root@linux mongodb-1.6.1]# /usr/local/php-fpm/bin/php -m|grep mongodb
mongodb
重启php-fpm:
[root@linux mongodb-1.6.1]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
#如果web服务器用的是Apache,需要重启httpd
创建php测试脚本:
[root@linux ~]# vim mongodb.php
添加以下内容:
<?php
$bulk = new MongoDB\Driver\BulkWrite;
$document = ['_id' => new MongoDB\BSON\ObjectID, 'name' => 'mongodb_test'];
$_id= $bulk->insert($document);
var_dump($_id);
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.mongodbtest', $bulk, $writeConcern);
?>
将脚本放到网站目录下请求:
[root@linux ~]# curl localhost/mongodb.php
登录MongoDB查看:
root@linux ~]# mongo -uuser1 -puser1
> use test
switched to db test
> show tables
mongodbtest
> db.mongodbtest.find()
{ "_id" : ObjectId("5dfa1feb915600294542e6e3"), "name" : "mongodb_test" }
#测试成功,数据已存储到MongoDB中
注意:如果MongoDB启动脚本配置了- - auth密码验证,该测试可能导致数据数据不能存储到MongoDB中
MongoDB副本集介绍
MongoDB主从也叫副本集,早期版本使用master-slave,一主一从和MySQL主从类似,但slave在此架构中为只读,当主宕机后,从不能自动切换为主,目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),从也是只读,支持给它们设置权重,当主宕掉后,权重值最高的从自动切换为主,在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
MongoDB副本集搭建
A机器(primary):192.168.234.128
B机器(secondary):192.168.234.130
编辑两台机器的MongoDB配置文件:
[root@linux ~]# vi /etc/mongod.conf
bindip需要指定本机地址:
将replication的注释去掉,并添加以下两行内容:
replication:
oplogSizeMB: 20
replSetName: mongodb_test
#oplog类似MySQL主从中的binlog,replSetName指定副本集名称
两台机器都修改完后重启MongoDB服务:
[root@linux ~]# systemctl restart mongod
在A机器连接MongoDB:
[root@linux ~]# mongo
> use admin
创建副本集的集合:
> config={_id:"mongodb_test",members:[{_id:0,host:"192.168.234.128:27017"},{_id:1,host:"192.168.234.130:27017"}]}
初始化:
> rs.initiate(config)
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1576679573, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1576679573, 1)
}
mongodb_test:SECONDARY>
#初始化完成后,命令行前缀变成了mongodb_test:SECONDARY,此时主从两台机器前缀都相同,过一会儿再按回车键,A机器的命令行前缀就会变为mongodb_test:PRIMARY>,当两台机器权重值相同时,在哪台机器上创建配置副本集的集合,哪台机器就优先变为主
查看状态:
mongodb_test:PRIMARY> rs.status()
如果从机器的stateStr项对应的值为STARTUP,则需进行如下操作:
>var config={_id:"mongodb_test",members:[{_id:0,host:"192.168.234.128:27017"},{_id:1,host:"192.168.234.130:27017"}]}
>rs.reconfig(config)
#此时再次查看rs.status()会发现从的状态变为SECONDARY
MongoDB副本集测试
在主(A机器)上创建库与集合:
mongodb_test:PRIMARY> use mytest
switched to db mytest
mongodb_test:PRIMARY> db.acc.insert({accID:1,UserName:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })
在从(B机器)上查看:
mongodb_test:SECONDARY> show dbs
出现以下报错:
需要执行以下命令:
mongodb_test:SECONDARY> rs.slaveOk()
即可查看:
mongodb_test:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
mytest 0.000GB
test 0.000GB
mongodb_test:SECONDARY> use mytest
switched to db mytest
mongodb_test:SECONDARY> show tables
acc
mongodb_test:SECONDARY> db.acc.find()
{ "_id" : ObjectId("5dfa3afa91ec600ff57a3b57"), "accID" : 1, "UserName" : "123", "password" : "123456" }
#在主上创建的库与集合已成功同步到从上
查看权重值 rs.config():
mongodb_test:PRIMARY> rs.config()
{
"_id" : "mongodb_test",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.234.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.234.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5dfa38954a1d61732c89ae6a")
}
}
#priority对应的值就是权重值,当前两台机器权重值都为1,当A机器宕机时,B机器会自动切换为主,当A机器恢复时,A机器会变为从,B机器依然是主,因为两台机器权重值相同
设置权重值:
在当前的主上执行以下命令:
mongodb_test:PRIMARY> cfg=rs.config()
mongodb_test:PRIMARY> cfg.members[0].priority=2
mongodb_test:PRIMARY> rs.reconfig(cfg)
members:配置副本集的集合
0:主机器的id
再次查看主机器的权重值已改变:
#这种情况下,A机器宕机后,B机器自动切换为主,当A机器恢复后,B机器会自动变为从,因为A机器的权重值大于B机器
补充: 需要配置一主多从的副本集同样按此步骤操作即可,当有多台从时,可以给每台设置不一样的权重值,这样当主宕机后,将由权重值最大的从优先切换为主
转载:https://blog.csdn.net/Powerful_Fy/article/details/103604693