Замечание: На платформах Unix модуль чувствителен к сценариям, которые используют системный вызов 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
для обновления своего представления
топологий.
Версии модуля до 1.2.0 используют API-интерфейс PHP-потоков для подключений к базам данных через внутренний API-интерфейс библиотеки » libmongoc, чтобы назначить пользовательские обработчики для связи с сокетами; однако новый клиент libmongoc создаётся для каждого менеджера MongoDB\Driver\Manager. В результате модуль сохраняет отдельные соединения с базой данных, но не информацию о состоянии аутентификации или топологии. Поэтому модулю приходится выдавать команды в начале каждого запроса, чтобы проверить подлинность и » обнаружить топологию сервера.
Соединения с базой данных сохраняются как хеш хоста, порта и строки URI-идентификатора сервера, которую передавали в конструктор менеджера MongoDB\Driver\Manager. Параметры массива конструктора не включаются в этот хеш.
Замечание: Версии модуля >= 1.1.8 and < 1.2.0 не сохраняют сокеты для SSL-соединений. Смотрите » PHPC-720 для получения дополнительной информации.
Несмотря на недостатки, которые связаны с сохранением SSL-соединений и информацией о топологии, эта версия модуля поддерживает все параметры SSL-контекста, поскольку использует API-интерфейс потоков PHP.