mongodb二进制版本命令行参数启动加身份认证

下载地址:https://www.mongodb.com/download-center/community
这里下载的版本:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.6.tgz

这里解压到 /home/software/mongodb 目录。
然后创建2个目录用于存放日志和数据。

[root@db-mongo ~]# mkdir /home/software/mongodb/log
[root@db-mongo ~]# mkdir /home/software/mongodb/data

# 先用不带身份认证参数启动(–auth)

[root@db-mongo ~]# /home/software/mongodb/bin/mongod --logpath /home/software/mongodb/log/log.log --dbpath /home/software/mongodb/data --maxConns 65535 --bind_ip_all --port 27017 --fork

# 命令行关闭服务,需要指定db数据目录

[root@db-mongo ~]# /home/software/mongodb/bin/mongod --shutdown --dbpath /home/software/mongodb/data/

# mongo控制台关闭

[root@db-mongo ~]# /home/software/mongodb/bin/mongo
> db.shutdownServer()

或者用kill 15 发送停止信号。

# 查看库

[root@db-mongo ~]# /home/software/mongodb/bin/mongo
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

# 切换库,如果库不存在,则会创建。

> use test
switched to db test

但此时数据库为空,show dbs看不到。

# 为admin库设置用户名密码,角色为超级管理员

> use admin
switched to db admin
> db.createUser({user:'root',pwd:'111111',roles:['root']})  #只有admin数据库才有root角色

Successfully added user: { "user" : "root", "roles" : [ "root" ] }

# 修改为带认证参数启动mongodb

[root@db-mongo ~]# /home/software/mongodb/bin/mongod --logpath /home/software/mongodb/log/log.log --dbpath /home/software/mongodb/data --maxConns 65535 --bind_ip_all --port 27017 --fork --auth
[root@db-mongo ~]# /home/software/mongodb/bin/mongo
> show dbs
> 

发现看不到前面3个库了,因为需要认证后才能看。

# 控制台认证admin库的账号密码

> use admin
switched to db admin
> db.auth("root","111111")
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

# 新建一个库,并设置密码,注意密码中不要带@艾特符号,mongodb是一个库一个账号。

> use rootop
> db.createUser({
user:"aaa",
pwd:"aaa###bbb",
roles:[
{"role":"readWrite","db":"rootop"},
{"role":"dbAdmin","db":"rootop"}
]})

# 插入数据

> db.rootop.insert({"user":"aaa"})
WriteResult({ "nInserted" : 1 })

# 启动关闭脚本保存为 mon.sh

#!/bin/bash
need_pass="--auth"
if [ "$2" == "false" ];then
	need_pass=""
fi

case $1 in
 start)
	/home/software/mongodb/bin/mongod --logpath /home/software/mongodb/log/log.log --dbpath /home/software/mongodb/data --maxConns 65535 --bind_ip_all --port 27017 --journal --fork $need_pass --wiredTigerCacheSizeGB=1
	;;
 stop)
	/home/software/mongodb/bin/mongod --shutdown --dbpath /home/software/mongodb/data/
	;;
	*)
	echo sh mon.sh start [false]/stop
	;;
esac

在测试环境发现mongo内存占用挺大,限制下内存。
# 限制内存参数,加到启动参数里。
比如限制为1G

--wiredTigerCacheSizeGB=1

# mongodb官方客户端
https://www.mongodb.com/download-center/compass

# 导出指定库,注意用库所对应的账密

[root@db-mongo ~]# /home/software/mongodb/bin/mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 -d xxx -o /root/backup/xxx # -o 保存备份的目录

# 导入指定库,注意用库所对应的账密

[root@db-mongo ~]# /home/software/mongodb/bin/mongorestore -h 127.0.0.1 --port 27017 -u root -p 123456 -d xxx --drop /root/backup/xxx

# 备份脚本,注意备份哪个库,就用哪个库的账号

#!/bin/bash
mongodump=/home/software/mongodb/bin/mongodump 
host=127.0.0.1
port=27017
user=root
pass=123456
db=xxx
path=/home/mongobak
dir_name=$(date +%Y-%m-%d-%H-%M-%S)
$mongodump -h $host --port $port -u $user -p $pass -d $db -o $path/$db-$dir_name

Mongodb集群之Replica Set

Mongodb集群之Replica Set

介绍转自网络
Mongodb有三种集群方式:Replica Set / Sharding / Master-Slaver

Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。

配置过程:
环境信息:centos6.5 x64
软件版本:mongodb-linux-x86_64-2.6.1

master :192.168.0.175
slave :192.168.0.176
arbitrate:192.168.0.159

master配置:

[root@master ~]# wget -c http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
[root@master ~]# tar zxvf mongodb-linux-x86_64-2.6.1.tgz
[root@master ~]# cp -R mongodb-linux-x86_64-2.6.1 /usr/local/mongodb #mongodb不需要编译,解压后是可执行文件。
[root@master ~]# mkdir /usr/local/mongodb/data #创建数据存放目录
[root@master ~]# mkdir /usr/local/mongodb/logs #日志存放目录
[root@master ~]# mkdir /usr/local/mongodb/etc #配置文件存放目录
[root@master ~]# vi /usr/local/mongodb/etc/mongodb.conf

#bind_ip = IPADDRESS #绑定接口IP,可不写。
port = 27017 #端口号默认27017
fork = true #守护进程方式运行
pidfilepath = /usr/local/mongodb/mongodb.pid #pid路径
logpath = /usr/local/mongodb/logs/mongodb.log #日志
dbpath = /usr/local/mongodb/data #数据存放目录
journal = true #存储模式
nohttpinterface = true #关闭http接口,默认关闭27018端口访问
directoryperdb = true #每个数据库将被保存在一个单独的目录
logappend = true #日志输出方式
replSet = reptest #副本集名称
oplogSize = 1000 #复制日志大小MB,默认为硬盘剩余空间的5%

保存退出。

slave配置:

[root@slave ~]# wget -c http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
[root@slave ~]# tar zxvf mongodb-linux-x86_64-2.6.1.tgz
[root@slave ~]# cp -R mongodb-linux-x86_64-2.6.1 /usr/local/mongodb
[root@slave ~]# mkdir /usr/local/mongodb/data
[root@slave ~]# mkdir /usr/local/mongodb/logs
[root@slave ~]# mkdir /usr/local/mongodb/etc
[root@slave ~]# vi /usr/local/mongodb/etc/mongodb.conf

port = 27017
fork = true
pidfilepath = /usr/local/mongodb/mongodb.pid
logpath = /usr/local/mongodb/logs/mongodb.log
dbpath = /usr/local/mongodb/data
journal = true
nohttpinterface = true
directoryperdb = true
logappend = true
replSet = reptest
oplogSize = 1000

保存退出。

arbitrate配置:

[root@arbitrate ~]# wget -c http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
[root@arbitrate ~]# tar zxvf mongodb-linux-x86_64-2.6.1.tgz
[root@arbitrate ~]# cp -R mongodb-linux-x86_64-2.6.1 /usr/local/mongodb
[root@arbitrate ~]# mkdir /usr/local/mongodb/data
[root@arbitrate ~]# mkdir /usr/local/mongodb/logs
[root@arbitrate ~]# mkdir /usr/local/mongodb/etc
[root@arbitrate ~]# vi /usr/local/mongodb/etc/mongodb.conf

port = 27017
fork = true
pidfilepath = /usr/local/mongodb/mongodb.pid
logpath = /usr/local/mongodb/logs/mongodb.log
dbpath = /usr/local/mongodb/data
journal = true
nohttpinterface = true
directoryperdb = true
logappend = true
replSet = reptest
oplogSize = 1000

保存退出。

启动主、备、仲裁节点:

[root@master ~]# /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
[root@slave ~]# /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
[root@arbitrate ~]# /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf

可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
这里在master执行:

[root@master ~]# /usr/local/mongodb/bin/mongo 192.168.0.175:27017 #默认端口号的话可以不加
MongoDB shell version: 2.6.1
connecting to: 192.168.0.175/test
> use admin #切换数据库
switched to db admin
> cfg={ _id:"reptest", members:[ {_id:0,host:'192.168.0.175:27017',priority:2}, {_id:1,host:'192.168.0.176:27017',priority:1},{_id:2,host:'192.168.0.159:27017',arbiterOnly:true}] }; #配置集群
{
 "_id" : "reptest ",
 "members" : [
 {
 "_id" : 0,
 "host" : "192.168.0.175:27017",
 "priority" : 2
 },
 {
 "_id" : 1,
 "host" : "192.168.0.176:27017",
 "priority" : 1
 },
 {
 "_id" : 2,
 "host" : "192.168.0.159:27017",
 "arbiterOnly" : true
 }
 ]
}
> rs.initiate(cfg) #初始化
{
 "info" : "Config now saved locally. Should come online in about a minute.",
 "ok" : 1
}
>

cfg可以是任意的名字,最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的10.10.148.130:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。
配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:

> rs.status()
{
 "set" : "reptest",
 "date" : ISODate("2015-03-20T07:52:31Z"),
 "myState" : 1,
 "members" : [
 {
 "_id" : 0,
 "name" : "192.168.0.175:27017",
 "health" : 1,
 "state" : 1,
 "stateStr" : "PRIMARY",
 "uptime" : 71,
 "optime" : Timestamp(1426837925, 1),
 "optimeDate" : ISODate("2015-03-20T07:52:05Z"),
 "electionTime" : Timestamp(1426837934, 1),
 "electionDate" : ISODate("2015-03-20T07:52:14Z"),
 "self" : true
 },
 {
 "_id" : 1,
 "name" : "192.168.0.176:27017",
 "health" : 1,
 "state" : 2,
 "stateStr" : "SECONDARY",
 "uptime" : 25,
 "optime" : Timestamp(1426837925, 1),
 "optimeDate" : ISODate("2015-03-20T07:52:05Z"),
 "lastHeartbeat" : ISODate("2015-03-20T07:52:30Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T07:52:30Z"),
 "pingMs" : 0,
 "syncingTo" : "192.168.0.175:27017"
 },
 {
 "_id" : 2,
 "name" : "192.168.0.159:27017",
 "health" : 1,
 "state" : 7,
 "stateStr" : "ARBITER",
 "uptime" : 25,
 "lastHeartbeat" : ISODate("2015-03-20T07:52:30Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T07:52:30Z"),
 "pingMs" : 0
 }
 ],
 "ok" : 1
}
reptest:PRIMARY>

同时可以查看对应节点的日志,发现正在等待别的节点生效或者正在分配数据文件。

测试:

在主节点,写入数据,去备节点查看。

[root@master mongodb]# /usr/local/mongodb/bin/mongo 192.168.0.175:27017
MongoDB shell version: 2.6.1
connecting to: 192.168.0.175:27017/test
reptest:PRIMARY> db.test.insert({'name':'111','phone':'12345678'});
WriteResult({ "nInserted" : 1 })
reptest:PRIMARY> db.test.find();
{ "_id" : ObjectId("550bd2228c9d92e7d9ef3b4c"), "name" : "111", "phone" : "12345678" }
reptest:PRIMARY>

备节点查看:

[root@slave mongodb]# /usr/local/mongodb/bin/mongo 192.168.0.176
MongoDB shell version: 2.6.1
connecting to: 192.168.0.176/test
reptest:SECONDARY> db.test.find();
error: { "$err" : "not master and slaveOk=false", "code" : 13435 } #没有权限
reptest:SECONDARY> rs.slaveOk(); #设置从库可查询
reptest:SECONDARY> db.test.find();
{ "_id" : ObjectId("550bd320da20623f56ebbc46"), "name" : "111", "phone" : "12345678" }
reptest:SECONDARY>

数据已同步。

关闭master(杀掉进程),看备机能否变为主:
备机执行rs.status();命令

reptest:PRIMARY> rs.status();
{
 "set" : "reptest",
 "date" : ISODate("2015-03-20T08:01:59Z"),
 "myState" : 1,
 "members" : [
 {
 "_id" : 0,
 "name" : "192.168.0.175:27017",
 "health" : 0,
 "state" : 8,
 "stateStr" : "(not reachable/healthy)", #不可达
 "uptime" : 0,
 "optime" : Timestamp(1426838434, 1),
 "optimeDate" : ISODate("2015-03-20T08:00:34Z"),
 "lastHeartbeat" : ISODate("2015-03-20T08:01:56Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T08:01:34Z"),
 "pingMs" : 0
 },
 {
 "_id" : 1,
 "name" : "192.168.0.176:27017",
 "health" : 1,
 "state" : 1,
 "stateStr" : "PRIMARY", #变为master
 "uptime" : 638,
 "optime" : Timestamp(1426838434, 1),
 "optimeDate" : ISODate("2015-03-20T08:00:34Z"),
 "electionTime" : Timestamp(1426838498, 1),
 "electionDate" : ISODate("2015-03-20T08:01:38Z"),
 "self" : true
 },
 {
 "_id" : 2,
 "name" : "192.168.0.159:27017",
 "health" : 1,
 "state" : 7,
 "stateStr" : "ARBITER",
 "uptime" : 595,
 "lastHeartbeat" : ISODate("2015-03-20T08:01:58Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T08:01:59Z"),
 "pingMs" : 0
 }
 ],
 "ok" : 1
}
reptest:PRIMARY>

往备机(176)插入数据:

reptest:PRIMARY> db.test.insert({'name':'333','phone':'33333333'});
WriteResult({ "nInserted" : 1 })
reptest:PRIMARY> db.test.find();
{ "_id" : ObjectId("550bd320da20623f56ebbc46"), "name" : "111", "phone" : "12345678" }
{ "_id" : ObjectId("550bd3a2bdbf370988e2e1be"), "name" : "222", "phone" : "87654321" }
{ "_id" : ObjectId("550bd484fe01fa0c130acc2f"), "name" : "333", "phone" : "33333333" }
reptest:PRIMARY>

启动主机(176)查看身份及数据:

reptest:SECONDARY> rs.status()
{
 "set" : "reptest",
 "date" : ISODate("2015-03-20T08:05:29Z"),
 "myState" : 1,
 "members" : [
 {
 "_id" : 0,
 "name" : "192.168.0.175:27017",
 "health" : 1,
 "state" : 1,
 "stateStr" : "PRIMARY",
 "uptime" : 16,
 "optime" : Timestamp(1426838660, 1),
 "optimeDate" : ISODate("2015-03-20T08:04:20Z"),
 "electionTime" : Timestamp(1426838721, 1),
 "electionDate" : ISODate("2015-03-20T08:05:21Z"),
 "self" : true
 },
 {
 "_id" : 1,
 "name" : "192.168.0.176:27017",
 "health" : 1,
 "state" : 2,
 "stateStr" : "SECONDARY",
 "uptime" : 16,
 "optime" : Timestamp(1426838660, 1),
 "optimeDate" : ISODate("2015-03-20T08:04:20Z"),
 "lastHeartbeat" : ISODate("2015-03-20T08:05:29Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T08:05:28Z"),
 "pingMs" : 0,
 "lastHeartbeatMessage" : "syncing to: 192.168.0.175:27017",
 "syncingTo" : "192.168.0.175:27017"
 },
 {
 "_id" : 2,
 "name" : "192.168.0.159:27017",
 "health" : 1,
 "state" : 7,
 "stateStr" : "ARBITER",
 "uptime" : 16,
 "lastHeartbeat" : ISODate("2015-03-20T08:05:29Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T08:05:29Z"),
 "pingMs" : 1
 }
 ],
 "ok" : 1
}
reptest:PRIMARY> db.test.find();
{ "_id" : ObjectId("550bd320da20623f56ebbc46"), "name" : "111", "phone" : "12345678" }
{ "_id" : ObjectId("550bd3a2bdbf370988e2e1be"), "name" : "222", "phone" : "87654321" }
{ "_id" : ObjectId("550bd484fe01fa0c130acc2f"), "name" : "333", "phone" : "33333333" }
reptest:PRIMARY>

身份变为master,数据也同步过来了。

现在模拟仲裁机宕机且完全不能恢复(重装后状态):

[root@arbitrate mongodb]# kill -9 $(cat mongodb.pid)
[root@arbitrate mongodb]# rm -rf data/*
[root@arbitrate mongodb]# rm -rf logs/*

master上通过rs.status();查看状态:

{
 "_id" : 2,
 "name" : "192.168.0.159:27017",
 "health" : 0,
 "state" : 8,
 "stateStr" : "(not reachable/healthy)",
 "uptime" : 0,
 "lastHeartbeat" : ISODate("2015-03-20T08:07:59Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T08:07:38Z"),
 "pingMs" : 0
 }

提示159这台机器不可达。

在仲裁机启动服务:

[root@arbitrate mongodb]# /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf

在master上再次查看状态:

{
 "_id" : 2,
 "name" : "192.168.0.159:27017",
 "health" : 1,
 "state" : 7,
 "stateStr" : "ARBITER",
 "uptime" : 51,
 "lastHeartbeat" : ISODate("2015-03-20T08:11:05Z"),
 "lastHeartbeatRecv" : ISODate("2015-03-20T08:11:06Z"),
 "pingMs" : 0
 }

变为仲裁状态。
关闭master(175),查看slave状态变为PRIMARY,表明仲裁机重装以后依旧生效。

Replica Set集群搭建测试完成。

linux下安装mongodb非关系型数据库

MongoDB简介
MongoDB是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发,官方网站地址是:http://www.mongodb.org/

NoSql,全称是 Not Only Sql,指的是非关系型的数据库。
下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用。通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。

特点:
高性能、易部署、易使用,存储数据非常方便。
主要功能特性有:
面向集合存储,易存储对象类型的数据。
模式自由。
支持动态查询。
支持完全索引,包含内部对象。
支持查询。
支持复制和故障恢复。
使用高效的二进制数据存储,包括大型对象(如视频等)。
自动处理碎片,以支持云计算层次的扩展性
支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
文件存储格式为BSON(一种JSON的扩展)。
可通过网络访问。

功能:
面向集合的存储:适合存储对象及JSON形式的数据。
动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

适用场合:
网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

系统环境:centos6.5_x64
安装:
下载mongodb(支持windows、linux、mac、Solaris):
linux64位下载:http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz

[root@localhost ~]# wget -c http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
[root@localhost ~]# tar zxvf mongodb-linux-x86_64-2.6.1.tgz
[root@localhost ~]# cp -R mongodb-linux-x86_64-2.6.1 /usr/local/mongodb/ #mongodb不需要编译,解压后是可执行文件。
[root@localhost ~]# mkdir /usr/local/mongodb/data #创建数据存放路径
[root@localhost ~]# mkdir /usr/local/mongodb/logs #日志存放路径
[root@localhost ~]# /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/mongodb.log --logappend &
[root@localhost ~]# lsof -i:27017
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mongod  26578 root    8u  IPv4  76661      0t0  TCP *:27017 (LISTEN)
[root@localhost ~]# echo "/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/mongodb.log --logappend &" >> /etc/rc.local #开机启动

至此mongodb安装完成。

安装php的mongodb扩展模块:
在php源码包中是没有mongodb扩展的,需要单独从github下载:
各版本下载地址:https://github.com/mongodb/mongo-php-driver/releases
最新linux版本:mongo-php-driver-1.5.2.tar.gz
如果php是yum安装,那么需要安装php-devel包中的phpize命令:

[root@localhost ~]# yum install -y php-devel
[root@localhost ~]# tar zxvf mongo-php-driver-1.5.2.tar.gz
[root@localhost ~]# cd mongo-php-driver-1.5.2
[root@localhost mongo-php-driver-1.5.2]# phpize #生成预配置环境
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
[root@localhost mongo-php-driver-1.5.2]# ./configure
[root@localhost mongo-php-driver-1.5.2]# make && make install
Installing shared extensions:     /usr/lib64/php/modules/

编辑php.ini配置文件,加载php模块路径:
[root@localhost ~]# vi /etc/php.ini
extension_dir = /usr/lib64/php/modules/  #指定php模块路径
编辑/etc/php.d/json.ini:
[root@localhost ~]# vi /etc/php.d/json.ini
extension=mongo.so #添加加载模块

至于为什么要编辑/etc/php.d/json.ini ?是因为之前是yum装的php,重启web服务后,默认先去读/etc/php.ini,再去/etc/php.d/下读配置文件。导致json.so模块加载顺序落后于mongo.so模块。但是mongo.so需要json.so的支持,由于顺序颠倒导致php无法正确加载mongo.so模块。如果是源码编译的php,一般不会出现这种情况。接着重启web服务。service httpd restart

[root@localhost ~]# php -m | grep mongo  #查看模块已加载
mongo

通过phpinfo就可以看到模块信息了。

json.so落后于mongo.so模块加载时的报错信息:
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/mongo.so’ – /usr/lib64/php/modules/mongo.so: undefined symbol: php_json_encode in Unknown on line 0