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

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

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

Каждая версия модуля начиная с 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)

Версии модуля до 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.

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top