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