PHP7 MongDB 安装与使用

PHP 7 MongoDB 安装与使用全攻略

注意:PHP 7 已于 2022 年正式结束支持(EOL),建议升级到 PHP 8.x 以获得安全更新和性能优化。但如果你必须在 PHP 7(例如 7.4)环境下使用 MongoDB,本指南基于官方文档和社区实践,提供完整步骤。MongoDB PHP 驱动分为 扩展(Extension)(低级 C 实现)和 库(Library)(高层 PHP API),两者结合使用。


一、环境要求

组件版本要求说明
PHP7.0 – 7.4推荐 7.4(最后支持版本)
MongoDB 服务器≥ 3.6建议 4.4+ 支持事务
Composer≥ 1.0用于安装库
PECL已安装用于扩展

验证 PHP 版本php -v


二、安装 MongoDB 扩展(Extension)

MongoDB 扩展是基础,必须先安装。它提供底层连接支持。

1. Linux (Ubuntu/Debian) 安装

# 更新包源
sudo apt update

# 安装依赖(包括 pkg-config 和 libssl-dev)
sudo apt install php7.4-dev php-pear libssl-dev pkg-config

# 使用 PECL 安装扩展(针对 PHP 7.4,调整版本号)
sudo pecl -d php_suffix=7.4 install mongodb

# 添加到 php.ini(CLI 和 FPM)
echo "extension=mongodb.so" | sudo tee /etc/php/7.4/mods-available/mongodb.ini
sudo phpenmod mongodb

# 重启服务
sudo systemctl restart apache2  # 或 nginx + php7.4-fpm

多 PHP 版本:使用 update-alternatives --set php /usr/bin/php7.4 切换默认版本。

2. Windows 安装

  1. 下载 DLL:访问 PECL MongoDB Releases,选择 PHP 7.x 的 x86/x64、非线程安全(NTS)版本(例如 php_mongodb-1.12.0-7.4-nts-vc15-x64.zip)。
  2. 解压 php_mongodb.dll 到 PHP 的 ext/ 目录(例如 C:\php7\ext\)。
  3. 编辑 php.ini(运行 php --ini 查找路径),添加:
   extension=php_mongodb.dll
  1. 重启 Apache/IIS,重启后运行 php -m | grep mongodb 验证。

3. macOS 安装

# 使用 Homebrew 安装 PHP 7.4(如果未安装)
brew install php@7.4

# 安装扩展
pecl -d php_suffix=7.4 install mongodb

# 添加到 php.ini
echo "extension=mongodb.so" >> /usr/local/etc/php/7.4/php.ini

# 重启 PHP-FPM
brew services restart php@7.4

4. 验证安装

php -m | grep mongodb
# 输出:mongodb

# 或创建 test.php
<?php
phpinfo();
?>
# 搜索 "mongodb" 确认模块加载

常见错误

  • pcre.h not found:安装 libpcre3-dev
  • Unable to load dynamic library:检查 DLL/路径匹配 PHP 版本/架构。
  • EOL 警告:PHP 7.1/7.2 已不支持新扩展,使用 mongodb-1.6.0 等旧版。

三、安装 MongoDB PHP 库(Library)

库提供高层 API(如 CRUD、聚合),通过 Composer 安装。

# 全局安装 Composer(如果未安装)
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# 在项目目录安装库(兼容 PHP 7)
composer require mongodb/mongodb:^1.12.0  # 选择 PHP 7 兼容版本

验证

composer show mongodb/mongodb

四、基本使用示例

1. 连接 MongoDB

<?php
require 'vendor/autoload.php';  // Composer 自动加载

use MongoDB\Client;

// 本地连接
$client = new Client("mongodb://localhost:27017");

// 副本集 + 认证
$client = new Client(
    "mongodb://user:pass@host1:27017,host2:27017/mydb?replicaSet=rs0&authSource=admin"
);

// 测试连接
try {
    $dbs = $client->listDatabases();
    echo "连接成功!数据库列表:\n";
    foreach ($dbs as $db) {
        echo "- " . $db->getName() . "\n";
    }
} catch (Exception $e) {
    echo "连接失败:" . $e->getMessage() . "\n";
}
?>

2. CRUD 操作

<?php
require 'vendor/autoload.php';
use MongoDB\Client;
use MongoDB\BSON\UTCDateTime;

$client = new Client("mongodb://localhost:27017");
$collection = $client->test->users;  // 数据库 test,集合 users

// 插入
$insertResult = $collection->insertOne([
    'name' => 'Alice',
    'age' => 25,
    'tags' => ['php', 'mongodb'],
    'created_at' => new UTCDateTime()  // UTC 时间戳
]);
echo "插入 ID: " . $insertResult->getInsertedId() . "\n";

// 查询(单个)
$user = $collection->findOne(['name' => 'Alice']);
var_dump($user);  // 输出文档

// 查询(多个)+ 排序/分页
$cursor = $collection->find(
    ['age' => ['$gte' => 18]],
    [
        'sort' => ['age' => -1],  // 降序
        'limit' => 5,
        'skip' => 0
    ]
);
foreach ($cursor as $doc) {
    echo $doc['name'] . " (年龄: {$doc['age']})\n";
}

// 更新
$collection->updateOne(
    ['name' => 'Alice'],
    ['$set' => ['age' => 26]]  // 更新年龄
);

// 删除
$collection->deleteOne(['name' => 'Alice']);
?>

3. 聚合查询(Aggregation)

<?php
// 按年龄分组统计
$pipeline = [
    ['$match' => ['age' => ['$gte' => 18]]],
    ['$group' => [
        '_id' => '$tags',  // 按标签分组
        'count' => ['$sum' => 1]
    ]],
    ['$sort' => ['count' => -1]]
];

$results = $collection->aggregate($pipeline);
foreach ($results as $result) {
    echo "标签 " . json_encode($result['_id']) . ": {$result['count']} 人\n";
}
?>

4. 事务(PHP 7.4+,需副本集)

<?php
$session = $client->startSession();
try {
    $session->startTransaction();

    $collection->insertOne(['name' => 'TxUser'], ['session' => $session]);
    $collection->updateOne(['name' => 'Alice'], ['$inc' => ['age' => 1]], ['session' => $session]);

    $session->commitTransaction();
    echo "事务成功\n";
} catch (Exception $e) {
    $session->abortTransaction();
    echo "事务失败: " . $e->getMessage() . "\n";
} finally {
    $session->endSession();
}
?>

五、性能优化与最佳实践

优化说明
连接池在 Client 构造器中设置 'maxConnections' => 50
索引$collection->createIndex(['name' => 1])
批量操作使用 insertMany()bulkWrite()
投影find($filter, ['projection' => ['name' => 1]]) 只返回字段
错误处理始终用 try-catch 包裹操作

调试:启用 ini_set('mongodb.debug', 'stderr'); 查看底层命令。


六、常见问题排查

问题解决方案
extension not loaded检查 php.ini 和重启服务;运行 php -i | grep mongodb
Authentication failed确保 URI 中有 &authSource=admin
Composer 依赖冲突指定旧版:^1.12.0
pcre.h not found (编译时)sudo apt install libpcre3-dev
PHP 7 EOL计划升级;旧版扩展如 mongodb-1.6.0 仅限安全修复

七、学习资源


下一步:运行上述示例测试连接。如果你遇到具体错误(如 OS 版本),提供更多细节,我可以给出针对性脚本!

文章已创建 2371

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部