Постоянные соединения с новым драйвером Mongo PHP

Для проекта я использую новый драйвер MongoDB для PHP с библиотекой (см.: https://docs.mongodb.com/php-library/master/), а не устаревший.

Мы используем PHP 7 как FPM.

Недавно я профилировал с помощью XDEBUG и понял, что первый запрос к базе данных значительно медленнее, чем второй, например

Session::validate -> Account::find 38ms
getProfile        -> Account::find 2ms

Где Account::find будет выполнять запрос на получение одного документа по его _id, и оба вызова будут искать разные документы.

Два моих вопроса, которые возникают

  1. Насколько я понимаю, первый запрос намного медленнее второго, потому что драйвер должен установить соединение с сервером базы данных, а в нашем случае также должен пройти аутентификацию. Это соединение не сохраняется между выполнениями скрипта. Это правильно?
  2. Если (1) верно, есть ли способ сохранить это соединение с новым драйвером? Насколько я понимаю, со старым драйвером соединения с базой данных могли сохраняться между запросами. (http://php.net/manual/de/mongo.connecting.persistent.php)

person Maximilian Schier    schedule 22.10.2016    source источник


Ответы (1)


Кто-то на github указал мне на этот сайт, так что теперь я могу ответить мой собственный вопрос. Цитировать:

Все версии драйвера, начиная с 1.2.0, сохраняют клиентский объект » libmongoc в рабочем процессе PHP, что позволяет ему повторно использовать подключения к базе данных, состояния аутентификации и информацию о топологии для нескольких запросов.

Но:

Версии драйвера PHP до 1.2.0 используют PHP Streams API для соединений с базой данных, используя API внутри » libmongoc для назначения пользовательских обработчиков для связи с сокетами; однако для каждого MongoDB\Driver\Manager создается новый клиент libmongoc. В результате драйвер сохраняет отдельные соединения с базой данных, но не сохраняет информацию о состоянии проверки подлинности или топологии. Это означает, что драйвер должен выдавать команды в начале каждого запроса для аутентификации и » обнаружения топологии сервера.

Поскольку последняя стабильная версия драйвера на момент написания этой статьи — 1.1.9, информация об аутентификации не сохраняется. Однако вы можете перейти на альфа-версию 1.2.0, которая может значительно ускорить процесс подключения, как я обнаружил в некоторых тестах на моей системе. В настоящее время есть несколько известных ошибок с альфа-версиями 1.2.0, поэтому я пока буду придерживаться более медленной версии 1.1.9.

Этот ответ скоро устареет...

person Maximilian Schier    schedule 02.11.2016