## Обработка и сохранение соединения

> Замечание: На платформах 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 используют 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.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open