注意: 在 Unix 平台上,扩展对使用 fork() 系统调用而不调用 exec() 的脚本很敏感。建议用户不要在派生子进程中重复使用 MongoDB\Driver\Manager 实例。
自 1.2.0 版以来的所有扩展版本都将 » libmongoc 客户端对象持久化到 PHP 工作进程中,这使其能够在多个请求中重用数据库连接、身份验证状态以及拓扑信息。
当调用 MongoDB\Driver\Manager::__construct() 时,将从其参数(即 URI 字符串和数组选项)创建哈希值。扩展将尝试为该哈希值找到先前持久化的 » libmongoc 客户端对象。如果找不到与哈希值匹配的现有客户端,则会创建一个新客户端并将其持久化以备将来使用。可以通过 "disableClientPersistence"
驱动程序选项禁用此行为。
每个客户端都包含自己的数据库连接以及服务器拓扑的视图(例如,独立、副本集、分片集群)。通过在 PHP 请求之间持久化客户端,扩展能够重用已建立的数据库连接,并消除对每次请求都要进行 » 服务器拓扑发现 的需求。
请考虑以下示例
<?php
$managers = [
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'),
new MongoDB\Driver\Manager('mongodb://rs1.example.com,rs2.example.com/', ['replicaSet' => 'myReplicaSet']),
];
foreach ($managers as $manager) {
$manager->executeCommand('test', new MongoDB\Driver\Command(['ping' => 1]));
}
?>
前两个 Manager 对象将共享同一个 » libmongoc 客户端,因为它们的构造函数参数相同。第三个和第四个对象将分别使用自己的客户端。总共将创建三个客户端,并且执行此脚本的 PHP 工作进程将打开两个到 127.0.0.1
的连接,以及一个到每个 rs1.example.com
和 rs2.example.com
的连接。如果扩展在发出 hello
命令后发现副本集的更多成员,它还将打开到这些服务器的额外连接。
如果同一个工作进程在第二个请求中再次执行脚本,则将重用这三个客户端,并且不会建立任何新连接。根据上一次请求服务的时间,扩展可能需要发出额外的 hello
命令来更新其对拓扑的视图。
1.2.0 版之前的扩展版本使用 PHP 的 Streams API 进行数据库连接,使用 » libmongoc 中的 API 来指定套接字通信的自定义处理程序;但是,会为每个 MongoDB\Driver\Manager 创建一个新的 libmongoc 客户端。因此,扩展会持久化单个数据库连接,但不会持久化身份验证状态或拓扑信息。这意味着扩展需要在每个请求开始时发出命令来进行身份验证以及 » 发现服务器拓扑。
数据库连接通过从服务器的主机、端口以及用于构造 MongoDB\Driver\Manager 的 URI 字符串派生的哈希值进行持久化。构造函数的数组选项不包含在此哈希值中。
注意: 版本 >= 1.1.8 且 < 1.2.0 的扩展不会为 SSL 连接持久化套接字。有关更多信息,请参阅 » PHPC-720。
尽管它在持久化 SSL 连接和拓扑信息方面存在缺陷,但此版本的扩展支持所有 SSL 上下文选项,因为它使用 PHP 的 Streams API。