PHP7访问MongoDB

一、安装PHP7

1.1 安装PHP7

参考《PHP安装(CentOS)》

二、安装PHP7驱动

2.1 安装PECL

官网:https://docs.mongodb.com/drivers/

下载:wget http://pear.php.net/go-pear.phar

安装:php go-pear.phar

2.2 安装驱动

pecl install mongodb

2.3 配置/etc/php.ini

vi /etc/php.ini

extension=mongodb.so

三、PHP代码连接测试

3.1 编写测试代码
<?php

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['name' => 'name1', 'age' => 21]);
$bulk->insert(['name' => 'name2', 'age' => 22]);   
$bulk->insert(['name' => 'name3', 'age' => 23]);   
$bulk->insert(['name' => 'name4', 'age' => 24]);
 
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$res = $manager->executeBulkWrite('chp.testdb', $bulk, $writeConcern);
echo 'Insert=';
print_r($res);


$query = new MongoDB\Driver\Query(['age' => 21], ['sort' => ['age' => 1]]);
$cursor = $manager->executeQuery('chp.testdb', $query);
 
$data = [];
foreach($cursor as $doc) {
    $data[] = $doc;
}
echo 'Query=';
print_r($data);



$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    ['name' => 'name2'],
    ['$set' => ['age' => 32, 'promise' => 'always smile!']]
);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$res = $manager->executeBulkWrite('chp.testdb', $bulk, $writeConcern);
echo 'Modify=';
print_r($res);


$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['name' => 'name3']);
$bulk->delete(['name' => 'name4']);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$res = $manager->executeBulkWrite('chp.testdb', $bulk, $writeConcern);
echo 'Delete=';
print_r($res);
3.2 运行结果
3.3 多并发下插入键值相同情况

默认情况下:_id字段为MongoDB自带的唯一值索引字段;

为了不重复,需要先判断查询相同键是否存在,存在则更新,否则插入,但是这种情况对多并发不好使;

多并发时,设置索引

# 单个字段唯一索引
db.collection.createIndex({name:1},{unique:true}

如需要多个字段联合唯一索引,可参照如下方式:

# 多个字段联合索引示例
db.collection.createIndex({name_one:1,name_two:1},{unique:true})

设置索引后,并发情况下,就可以直接插入,如果当前索引字段name不存在,则会插入成功,若已经存在,则会捕捉异常并执行更新操作。即使在并发情况下,由于唯一索引机制,也不会出现同时插入相同文档的结果,并发下插入失败的的操作将会重新进行后续的更新操作。这样既提高了MongoDB的写入的效率也解决了并发下重复数据的问题。

发表回复