Все версии драйвера, начиная с 1.3.0, используют постоянные соединения, чтобы минимизировать количество подключений к каждому серверу базы данных. Эти соединения сохраняются рабочим процессом PHP и могут использоваться повторно между несколькими запросами.
Перед подключением к серверу базы данных, драйвер создаст хеш для соединения на основе своего хоста, порта, имени набора реплик (если есть), любых учетных данных аутентификации (например, имени пользователя, пароля, базы данных) и идентификатора процесса. Если для этого хеша уже существует соединение, оно будет использоваться вместо создания нового соединения, связанного с этим хешем. MongoClient::getConnections() может использоваться для получения информации о каждом постоянном соединении. Рассмотрим следующий пример:
<?php
$m1 = new MongoClient('mongodb://localhost');
$m2 = new MongoClient('mongodb://localhost');
$m3 = new MongoClient('mongodb://user:pw@localhost');
$m4 = new MongoClient('mongodb://127.0.0.1');
$m5 = new MongoClient('mongodb://rs1.local:30017,rs2.local:30018/?replicaSet=rs');
$m6 = new MongoClient('mongodb://sharding.local:40017');
foreach (MongoClient::getConnections() as $conn) {
echo $conn['hash'], "\n";
}
?>
Результатом выполнения данного примера будет что-то подобное:
localhost:27017;-;X;15487 localhost:27017;-;admin/user/c56c…8bbc;15487 127.0.0.1:27017;-;X;15487 rs1.local:30017;rs;X;15487 rs2.local:30018;rs;X;15487 sharding.local:40017;-;X;15487
В этом примере $m1 и $m2 имеют одинаковый хэш и имеют постоянное соединение. Соединения друг с другом экземпляра MongoClient для хеширования уникальных значений и использования их собственных сокетов. Обратите внимание, что у "localhost" и "127.0.0.1" разный хэш; Разрешение DNS не учитывается.