PHP Conference Nagoya 2025

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

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

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top