Обработка соединения и постоянство

Замечание: На Unix, драйвер MongoDB чувствителен к сценариям, которые используют системный вызов fork() без последующего exec(). Пользователям рекомендуется не переиспользовать экземпляр MongoDB\Driver\Manager в дочернем процессе. child process.

Постоянство подключения и топологии (версия PHP начиная с 1.2.0)

Все версии драйвера, начиная с 1.2.0, сохраняют клиентский объект » libmongoc в рабочем процессе PHP, что позволяет ему повторно использовать соединения с базой данных, состояния аутентификации и информацию о топологии в нескольких запросах.

Когда вызывается MongoDB\Driver\Manager::__construct(), из его аргументов создается хеш (т.е. строка URI и параметры массива). Драйвер попытается найти ранее сохраненный клиентский объект » libmongoc для этого хэша. Если существующий клиент не может быть найден для хеша, будет создан новый клиент (и сохранен для будущего использования).

Каждый клиент содержит свои собственные подключения к базе данных и представление топологии сервера (например, автономный, набор реплик, кластер сегментов). Сохраняя клиент между запросами 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. Если драйвер обнаруживает дополнительных членов набора реплик после выполнения команд isMaster, он также открывает дополнительные подключения к этим серверам.

Если этот же процесс снова выполнит сценарий во втором запросе, эти три клиента будут использованы повторно, и новые подключения не будут выполняться. В зависимости от того, как давно был обработан предыдущий запрос, драйверу может потребоваться выполнить дополнительные команды isMaster для обновления своего представления топологий.

Постоянство сокетов (версии PHP до 1.2.0)

Версии драйвера PHP до 1.2.0 используют PHP's Streams API для соединений с базой данных, используя API в » libmongoc для определения пользовательских обработчиков для связи с сокетами; однако новый клиент libmongoc создается для каждого MongoDB\Driver\Manager. В результате драйвер сохраняет отдельные соединения с базой данных, но не информацию о состоянии аутентификации или топологии. Это означает, что драйвер должен выдавать команды в начале каждого запроса для проверки подлинности и » обнаружения топологии сервера.

Соединения с базой данных сохраняются с помощью хэша, полученного из хоста, порта и строки URI сервера, используемой для построения MongoDB\Driver\Manager. Параметры массива конструктора не включены в этот хэш.

Замечание: Версии драйвер >= 1.1.8 and < 1.2.0 не сохраняют сокеты для соединений SSL. Смотрите » PHPC-720 для получения дополнительной информации.

Несмотря на недостатки, связанные с сохранением соединений SSL и информацией о топологии, эта версия драйвера поддерживает все параметры контекста SSL, поскольку использует PHP's Streams API.