Статьи

MongoDB Драйвер Советы и хитрости: PHP

Большая часть запросов на поддержку MongoLab — это вопросы о том, как правильно настроить и использовать определенный драйвер MongoDB.

Этот пост является третьим в серии, где мы подробно рассмотрим каждый из основных драйверов MongoDB. Драйвер, который мы рассмотрим здесь, это драйвер PHP, разработанный и поддерживаемый командой MongoDB, Inc. (в первую очередь @derickr , @bjori и @jmikola ).

В этом посте:

PHP-драйвер MongoDB

Этот пост призван помочь вам понять, как эффективно настроить и использовать драйвер PHP в вашем приложении MongoDB. Для справки вы можете найти полную документацию по драйверу PHP на сайте сообщества PHP.

Простой пример PHP

Вы можете найти простой пример подключения, вставки, обновления и запросов с использованием драйвера PHP в Языковом центре MongoLab .

Готовые к настройке соединения

Мы часто видим неправильные конфигурации драйвера, особенно из-за таймаутов и соединений с репликами. Чтобы помочь вам подключиться к MongoLab (или любому облачному MongoDB) с помощью драйвера PHP, мы предоставили следующие рекомендуемые MongoLab настройки:

// extension mongo.so 1.5.x
$uri = "mongodb://myuser:mypassword@host1:port1,host2:port2/mydb";

/* 
 * We recommend explictly configuring a connection timeout (see tips & tricks
 * below). Specify the replica set name to avoid connection errors.
 */ 
$options = array("connectTimeoutMS" => 30000, "replicaSet" => "replicaSetName");
$client = new MongoClient($uri, $options);

Дополнительные параметры подключения, которые поддерживаются драйвером PHP, можно найти здесь .

PHP драйверы советы и хитрости

Построения индекса могут иногда блокировать новые соединения

При установлении соединения с набором реплик MongoDB драйвер сначала пытается подключиться и аутентифицироваться к каждому не скрытому узлу в кластере. Если узел «не работает», он будет пропущен. Однако, если узел находится в рабочем состоянии, но удерживает блокировку записи так, что команда authenticate не может быть выполнена, драйвер будет зависать. Это часто встречается при построении индексов, поскольку во всех версиях MongoDB до 2.6 все сборки индекса (фоновые или передние) будут строиться на переднем плане на вторичных.

В версии 1.5.3 драйвера PHP (который скоро будет выпущен) будет улучшено, что позволяет драйверу обходить аутентификацию на вторичном узле, создающем индекс. Обратите внимание, что это применимо только в том случае, если вторичное устройство проходит начальную синхронизацию . В следующем выпуске эта проблема будет решена во время любого построения индекса переднего плана.

Рассмотрите возможность снижения is_master_interval по умолчанию

Для приложений с высокими требованиями к доступности мы рекомендуем изучить параметры конфигурации среды выполнения драйвера PHP по умолчанию (заданные в файле php.ini). В частности, опция mongo.is_master_interval управляет скоростью восстановления драйвера после выбора кластера реплики.

Параметр is_master_interval (по умолчанию: 15 секунд) устанавливает интервал, в течение которого драйвер отправляет запросы «isMaster» каждому экземпляру mongod. Эти запросы помогают драйверу определить топологию набора реплик; в частности, запрос проверяет, является ли конкретный узел основным и может ли получать записи.

Мы рекомендуем поэкспериментировать с понижением этого значения до 1 или 2 секунд, чтобы ваш драйвер мог быстро найти первичный сервер после выбора или переключения при сбое. Конечно, в зависимости от того, сколько у вас клиентов, вам понадобится значение, которое не пингует ваши серверы слишком часто.

Также имейте в виду, что когда выбор или аварийное переключение приводят к изменению основного сервера, всегда будет несколько секунд, когда ваш драйвер получит «MongoConnectionException» с сообщением «Серверы-кандидаты не найдены». Важно обработать эти исключения в вашем коде, чтобы ваше приложение не завершалось.

Поймите, как обрабатываются соединения, и настройте connectionTimeoutMS.

Драйвер PHP не использует пул соединений . Поэтому рекомендуется создать одно соединение с базой данных для каждого процесса PHP.

Однако, если вы создаете веб-приложение, вполне вероятно, что у вас будет много рабочих процессов PHP (и в худшем случае новый процесс PHP на HTTP-запрос). Это создает сценарий, в котором вы потенциально создаете много новых соединений с базой данных, поскольку драйвер PHP не может совместно использовать соединения между процессами. Из-за этого приложения PHP могут быть особенно уязвимы для временных условий, которые препятствуют созданию начальных соединений с базой данных (сетевые сообщения, занятые серверы и т. Д.).

Чтобы помочь в этом, мы рекомендуем вам настроить параметр connectionTimeoutMS и знать о параметре mongo.ping_interval в php.ini.

connectionTimeoutMS

Драйвер PHP явно не определяет время ожидания соединения по умолчанию. Вместо этого значение по умолчанию определяется настройкой default_socket_timeout в файле php.ini (по умолчанию: 60 секунд). С этим значением по умолчанию ваш драйвер будет ждать до 60 секунд при подключении до истечения времени ожидания. Принимая во внимание, что каждый запрос может выдержать этот тайм-аут, вы можете захотеть уменьшить его.

Мы настоятельно рекомендуем явно установить параметр connectionTimeoutMS с помощью параметров URI строки подключения . Один из подходов — экспериментировать со значениями от 5 до 30 секунд. Другой подход заключается в том, чтобы настроить время ожидания соединения до 1 секунды, а затем при повторной попытке постепенно увеличить значение времени ожидания до 30 секунд.

mongo.ping_interval

Второй параметр, о котором следует знать, это mongo.ping_interval, который устанавливается в файле php.ini и имеет значение по умолчанию 5 секунд. Эта опция устанавливает интервал, в течение которого драйвер отправляет запросы ping каждому экземпляру mongod, чтобы найти «отключенный» узел. mongo.ping_interval используется в сочетании с концепцией драйвера PHP «черного списка» сервера, который отслеживает эти «отключенные» узлы.

«Черный список» сервера драйверов PHP сообщает драйверу, какие узлы он должен игнорировать (не подключаться) в течение секунд ping_interval. В случае, когда значение ping_interval равно 5, драйвер попытается подключиться к «нисходящему» узлу (назовем его узлом X), тайм-аут, а затем перейдет к следующему узлу. Так как время подключения истекло, драйвер добавляет узел X в «черный список». Теперь новые соединения будут знать, что нужно обходить узел X. Через 5 секунд черный список очищается, и новые соединения будут пытаться подключиться к узлу X еще раз.

У нас нет конкретной рекомендации для mongo.ping_interval, однако, концепции, стоящие за этим, полезно знать, если вы используете драйвер в работе.

Вы все готово!

Мы надеемся, что этот пост поможет вам максимально использовать драйвер PHP. Если у вас есть какие-либо советы и рекомендации, которыми вы хотели бы поделиться, пожалуйста, оставьте их в комментариях или напишите нам по адресу [email protected], чтобы мы могли поделиться своими знаниями. Счастливого взлома!