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

Замечание: На Unix, драйвер MongoDB чувствителен к сценариям, которые используют системный вызов 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)

Версии драйвера 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.

add a note add a note

User Contributed Notes

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