Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 157 · После первого каталога и основ MongoDB Driver

MongoDB: выбор сервера, настройки Manager и диагностика ответа

От первого ping и известной топологии до фактического источника строк: defaults, per-call настройки, типы серверов, роли replica set, снимки hello и честная интерпретация задержки.

Узнать источник ответа и не путать его с настройками

Товар пришёл из MongoDB, но для разбора проблемы нужно понять: какой узел ответил, какие настройки использовал клиент и что именно означает isPrimary=false. Научимся получать эти сведения рядом с реальными строками каталога. Начнём с одного доступного сервера, затем отделим подтверждённые факты этого стенда от правил для replica set.

Если MongoDB пока незнакома, сначала откройте документ, коллекцию и первый товар. Запись $object->method() означает вызов действия у объекта: класс, объект и метод. Manager хранит URI и настройки клиента и выполняет операции. Server представляет обнаруженный узел. Cursor позволяет прочитать ответ операции и узнать её Server. ServerDescription — отдельный неизменяемый снимок доступного описания узла.

Endpoint — адрес подключения: хост и порт. На учебном компьютере 127.0.0.1 означает этот же компьютер, а 27075 — выделенный порт MongoDB. Это не имя базы и не номер товара. Standalone — одиночный mongod. Replica set — несколько участников с общей репликацией и ролями; primary принимает обычную запись, secondary хранит реплицируемые данные. Подробнее: видимость, подтверждение и выбор реплики.

От настроек к фактическому источнику строк
  1. Manager: URI и defaults
  2. Query: CUP, поля sku/price, limit 1
  3. executeQuery отправляет чтение
  4. Cursor: строка CUP, 500
  5. Cursor::getServer: узел данного ответа
  6. getHost/getPort/getType: понятная диагностика

Когда $cursor уже получен запросом, первые два полезных действия укладываются в три строки. Переменная $server хранит объект узла; ->getHost() читает хост, ->getPort() — порт. Точка склеивает строки для вывода. Эти методы не перебирают товары и не печатают пароль из URI.

$server = $cursor->getServer();
echo $server->getHost(); // 127.0.0.1 на нашем стенде
echo ':'.$server->getPort(); // :27075

Этот фрагмент использует подготовленный Cursor. В самостоятельных программах ниже есть полное создание Manager, реальные запросы, видимые результаты и, где требуются товары, собственная коллекция с очисткой. URI и тип стенда выбраны явно, поэтому ожидаемые таблицы относятся к конкретному Standalone, а не ко всем возможным кластерам.

Manager, Server, Cursor и снимок: четыре разные задачи

Конфигурация, наблюдение и результат операции отвечают на разные вопросы. Если перепутать их, можно решить, что настройка secondary создала реплику, что read concern определяет адрес, а короткий RTT гарантирует быстрый каталог.

СведенияКак получитьЧто они доказывают
Defaults чтения и записиManager::getReadConcern / getReadPreference / getWriteConcernКакие клиентские настройки заданы по умолчанию
Известные узлыManager::getServersКакую топологию уже знает драйвер; getter сам не соединяется
Выбранный сейчас узелManager::selectServerКакой доступный Server подошёл под данный выбор
Узел конкретного ответаCursor::getServerК какому Server относится результат этого Cursor
Роль и сведения helloServer::getType / is* / getInfo / getTagsДоступное описание типа и роли, а не вечную гарантию
Снимок описанияServer::getServerDescriptionНеизменяемые значения на момент вызова
Задержка helloServer::getLatencyRTT hello в мс либо NULL; не время PHP или find

В этой главе URI использует directConnection=true, поэтому топология клиента — Single. Для доступного Standalone алгоритм выбора не отбирает узлы по read preference: выбирать между primary и secondary здесь не из кого. Поэтому secondary может успешно выбрать Standalone, у которого isSecondary=false. В replica set строгий secondary имеет другой смысл и может завершиться ошибкой, если подходящей реплики нет. Эти два случая нельзя смешивать.

Менять default объекта Manager ради одной операции не требуется. ReadPreference передаётся подходящему вызову, ReadConcern — Query или поддерживающей его команде, WriteConcern — записи. Собственные правила selectServer также важны: отсутствие аргумента означает primary, даже если в Manager задан secondaryPreferred.

Подготовить одиночный стенд и запустить примеры

Нужны PHP 8.4+ CLI, ext-mongodb 2.5+ и отдельный локальный MongoDB 8.0+. Composer для низкоуровневого Driver API не требуется. В README каждого ZIP приведены ссылки установки, проверка совпадения DLL со сборкой PHP, запуск mongod с bind_ip=127.0.0.1 и портом 27075. Standalone без аутентификации допустим здесь только как отдельный локальный учебный стенд.

php --ri mongodb
$env:PHPMAN_MONGODB_URI='mongodb://127.0.0.1:27075/?directConnection=true&retryWrites=false'
$env:PHPMAN_MONGODB_DATABASE='php_manual_lab'
php example.php

Каждый ZIP распакуйте в свою папку вместе с ms122-helper.php и README. result.html показывает фактическую таблицу и раскрываемые диагностические данные; result.json содержит строки таблицы; metrics.json — версии, контрольные проверки и SHA256 файлов. Все восемь программ действительно обращаются к MongoDB. Пять читают диагностику без создания коллекций; три создают только собственную коллекцию со случайным именем и удаляют её в finally с проверкой отсутствия.

Увидеть сервер после настоящего обращения, а не по факту new Manager

При запуске приложения список известных серверов может быть пуст. Это ещё не означает, что сервер выключен: создание Manager и реальная команда — разные действия. Получим осмысленную проверку соединения и адрес сервера, который ответил.

Исходные данные

Отдельный локальный mongod на 127.0.0.1:27075. Пока нет ни товаров, ни создаваемой коллекции: команда ping проверяет обмен с сервером. Manager создаётся с уникальным appname, чтобы пример не опирался на ранее использованное соединение.

Путь данных и наблюдений
  1. Создать Manager: хранит URI и настройки
  2. getServers: узнать уже известные описания
  3. Выполнить ping: действительно обратиться к MongoDB
  4. Cursor::getServer: получить ответивший узел
  5. getServers: показать обнаруженный Standalone

Короткое действие

$before = $manager->getServers();
$manager->executeReadCommand('admin', new MongoDB\Driver\Command(['ping'=>1]));
$after = $manager->getServers();

Видимый результат

ХостПортФактический типРеальный ответ
127.0.0.127075Standaloneping принят

Разбор результата

getServers возвращает представление топологии, которое уже известно драйверу. Сам этот getter не принуждает его устанавливать соединение. В детали результата записано фактическое число описаний до команды; оно не подменяется предположением «всегда 0». После ping на нашем прямом одиночном подключении известен один узел. Host и port берутся из Server, а не из строки, заранее записанной в таблицу.

Ошибки и границы применения

Успешный ping подтверждает доступность на момент команды, но не право приложения читать произвольную коллекцию, не корректность всех учётных данных другого пользователя и не дальнейшую доступность узла. В защищённом окружении следует проверять нужную операцию с нужными правами. getServers не является перечнем всех физических машин любого кластера.

Самостоятельная программа, helper и архив
Увидеть сервер после настоящего обращения, а не по факту new ManagerСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database([]);
$before=$manager->getServers();
$cursor=$manager->executeReadCommand('admin',new MongoDB\Driver\Command(['ping'=>1]));
$reply=$cursor->toArray()[0]; $used=$cursor->getServer();
$after=$manager->getServers(); $rows=[];
foreach ($after as $server) { $rows[]=[$server->getHost(),$server->getPort(),ms122Type($server),$reply->ok==1?'ping принят':'отказ']; }
$checks=['ping_acknowledged'=>$reply->ok==1,'one_known_server'=>count($after)===1,
    'observed_endpoint'=>ms122Endpoint($after[0])===ms122Endpoint($used),
    'standalone_after_contact'=>$used->getType()===MongoDB\Driver\Server::TYPE_STANDALONE,
    'before_is_observation'=>is_array($before)];
$details=['Сколько серверов было известно ДО ping'=>count($before),'Сколько известно ПОСЛЕ'=>count($after),
    'Почему первый размер не равен проверке связи'=>'getServers читает уже известное драйверу состояние; обязательного нуля до вызова не предполагаем'];
$checks['readonly_no_collection_created']=true;
$details['Область работы']='Только диагностика и чтение служебных ответов; коллекции не создавались';
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-lazy-discovery',['Хост', 'Порт', 'Фактический тип', 'Реальный ответ'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-lazy-discovery: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-lazy-discovery: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Сравните число серверов до ping и после него в раскрывающейся диагностике. Затем найдите в программе вызов, который действительно делает запрос. Ответ: executeReadCommand с ping; чтение массива из getServers само по себе не является проверкой сети.

Сравнить пять политик на одном standalone и не выдумать secondary

Разработчик записал secondary в настройках и решил, что чтение теперь обязательно идёт на вторую машину. Проверим это на нашем конкретном типе подключения: у standalone второй реплики вообще нет.

Исходные данные

Один прямой Standalone. В Manager установлен secondaryPreferred и readConcern local. По очереди передаём selectServer пять разных ReadPreference; отдельно вызываем selectServer без аргумента. Никакие данные не меняются.

Путь данных и наблюдений
  1. Настройки Manager: secondaryPreferred и local
  2. Явный ReadPreference для очередного выбора
  3. selectServer выполняет выбор в топологии Single
  4. Показать реальный host, port, type и isSecondary
  5. Повторно прочитать defaults Manager: они прежние

Короткое действие

$server = $manager->selectServer(new MongoDB\Driver\ReadPreference('secondary'));
echo $server->getType(); // TYPE_STANDALONE на этом direct-стенде, не RS_SECONDARY.

Видимый результат

Переданный режимEndpointТипЭто RS secondary?
primary127.0.0.1:27075Standalonefalse
primaryPreferred127.0.0.1:27075Standalonefalse
secondary127.0.0.1:27075Standalonefalse
secondaryPreferred127.0.0.1:27075Standalonefalse
nearest127.0.0.1:27075Standalonefalse

Разбор результата

Для топологии Single спецификация выбора считает доступный единственный сервер подходящим и не применяет read preference как фильтр между репликами. Поэтому даже secondary здесь возвращает тот же Standalone с isSecondary=false. Это не модель поведения replica set. Вызов selectServer() без аргумента использует primary по своему контракту; он не подставляет автоматически secondaryPreferred из defaults Manager. Переданный объект выбирает режим данного вызова, но не перенастраивает Manager.

Ошибки и границы применения

Не переносите эту таблицу на replica set: там primary/secondary, теги и доступность узлов действительно участвуют в выборе, и строгий secondary может не найти сервер. Пять строк — проверка пяти вызовов в одном доступном standalone, а не испытание распределения нагрузки или отказоустойчивости. Пустые getTags здесь означают отсутствие тегов, а не список всех возможных тегов кластера.

Самостоятельная программа, helper и архив
Сравнить пять политик на одном standalone и не выдумать secondaryСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database(['readPreference'=>'secondaryPreferred','readConcernLevel'=>'local']);
$before=ms122Policies($manager); $rows=[]; $endpoints=[]; $tags=[];
foreach (['primary','primaryPreferred','secondary','secondaryPreferred','nearest'] as $mode) {
    $preference=new MongoDB\Driver\ReadPreference($mode);
    $server=$manager->selectServer($preference);
    $rows[]=[$preference->getModeString(),ms122Endpoint($server),ms122Type($server),$server->isSecondary()?'true':'false'];
    $endpoints[]=ms122Endpoint($server); $tags[]=$server->getTags();
}
$implicit=$manager->selectServer();
$ping=ms122Command($manager,'admin',['ping'=>1])[0];
$after=ms122Policies($manager);
$checks=['all_same_endpoint'=>count(array_unique($endpoints))===1,
    'standalone_selected'=>$implicit->getType()===MongoDB\Driver\Server::TYPE_STANDALONE,
    'manager_policy_not_mutated'=>$before===$after && $after['readPreference']==='secondaryPreferred' && $after['readConcern']==='local' && $after['w']===1,
    'tags_really_empty'=>$tags===[[],[],[],[],[]],'server_answers'=>$ping['ok']==1];
$details=['Настройки Manager до'=>$before,'Настройки Manager после'=>$after,'Реальные теги каждого выбранного сервера'=>$tags,
    'Вызов selectServer без параметра'=>ms122Endpoint($implicit),'Объяснение'=>'directConnection=true задаёт топологию Single; она игнорирует ReadPreference при выборе доступного единственного узла'];
$checks['readonly_no_collection_created']=true;
$details['Область работы']='Только диагностика и чтение служебных ответов; коллекции не создавались';
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-selection-modes',['Переданный режим', 'Endpoint', 'Тип', 'Это RS secondary?'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-selection-modes: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-selection-modes: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. В таблице найдите secondary и сравните его с isSecondary. Почему false не является ошибкой? Ответ: политика выбора применяется в контексте топологии; данное прямое подключение Single не создаёт вторичный узел. Для опытов с replica set используйте отдельную главу о согласованности.

Практический вопрос: Set mongodb read preference at mongo server level. Автор ищет серверную глобальную настройку маршрутизации чтения. Наше объяснение показывает клиентский ReadPreference, сохранность defaults и зависимость выбора от Single/replica-set топологии. Обсуждение определяет задачу; текущие контракты драйвера и правила выбора сверены с первичной документацией.

Прочитать карточку с параметрами вызова и установить её настоящий сервер

Экран каталога обычно допускает одну политику чтения, а отдельная проверка товара требует явно выбранной политики. Нужно увидеть параметры именно этого запроса, адрес его ответа и убедиться, что остальные обращения не получили новые defaults случайно.

Исходные данные

В собственной коллекции два товара: CUP за 500 и LAMP за 1200. Defaults Manager: secondaryPreferred, read concern явно не задан. У Query фильтр sku=CUP, проекция sku/price без _id, limit=1 и явный readConcern local. Только executeQuery получает ReadPreference primary.

Путь данных и наблюдений
  1. Два товара в собственной коллекции
  2. Query выбирает CUP и два нужных поля
  3. В executeQuery передать primary для данного чтения
  4. Cursor возвращает CUP, 500 и свой Server
  5. Defaults Manager всё ещё secondaryPreferred; level не задан

Короткое действие

$cursor = $manager->executeQuery($namespace, $query,
    ['readPreference'=>new MongoDB\Driver\ReadPreference('primary')]);
$server = $cursor->getServer();
echo $server->getHost(), ':', $server->getPort();

Видимый результат

АртикулЦенаСервер результатаРежим вызоваРежим Manager после
CUP500127.0.0.1:27075primarysecondaryPreferred

Разбор результата

readConcern описывает требуемый уровень видимости данных, readPreference — правило выбора сервера; это разные настройки. Query получает первый объект, опции executeQuery — второй. Возвращённый Cursor знает фактический Server. После чтения getReadPreference и getReadConcern у Manager показывают прежние значения. NULL уровня означает «не задан явно», а не отсутствие данных и не доказательство конкретного серверного default.

Ошибки и границы применения

На единственном Standalone нельзя доказать переход с secondary на primary: ни одной такой пары здесь нет. Этот пример реально проверяет данные, объекты настроек, сохранность defaults и endpoint. Смысл этих политик при репликации разбирается на отдельном replica set. Не составляйте фильтр MongoDB напрямую из произвольного пользовательского массива; приложение само задаёт допустимые поля и операторы.

Самостоятельная программа, helper и архив
Прочитать карточку с параметрами вызова и установить её настоящий серверСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database(['readPreference'=>'secondaryPreferred']);
$collection='mongodb122_server_'.bin2hex(random_bytes(8)); $namespace=$database.'.'.$collection; $owned=false;
if (ms122Exists($manager,$database,$collection)) { throw new RuntimeException('Unexpected collection collision'); }
try {
    ms122Command($manager,$database,['create'=>$collection],true); $owned=true;
ms122Seed($manager,$namespace,[['_id'=>1,'sku'=>'CUP','price'=>500],['_id'=>2,'sku'=>'LAMP','price'=>1200]]);
$before=ms122Policies($manager);
$readConcern=new MongoDB\Driver\ReadConcern('local'); $readPreference=new MongoDB\Driver\ReadPreference('primary');
$query=new MongoDB\Driver\Query(['sku'=>'CUP'],['projection'=>['_id'=>0,'sku'=>1,'price'=>1],'limit'=>1,'readConcern'=>$readConcern,'maxTimeMS'=>1000]);
$cursor=$manager->executeQuery($namespace,$query,['readPreference'=>$readPreference]);
$cursor->setTypeMap(['root'=>'array','document'=>'array','array'=>'array']); $documents=$cursor->toArray();
$server=$cursor->getServer(); $after=ms122Policies($manager);
$rows=[[$documents[0]['sku'],$documents[0]['price'],ms122Endpoint($server),$readPreference->getModeString(),$after['readPreference']]];
$checks=['exact_screen_data'=>$documents===[['sku'=>'CUP','price'=>500]],
    'manager_defaults_unchanged'=>$before===$after && $after['readPreference']==='secondaryPreferred' && $after['readConcern']===null,
    'explicit_query_policy'=>$readConcern->getLevel()==='local' && $readPreference->getModeString()==='primary',
    'actual_cursor_server'=>$server->getHost()==='127.0.0.1' && $server->getType()===MongoDB\Driver\Server::TYPE_STANDALONE];
$details=['Manager до'=>$before,'Параметры этого вызова'=>['readConcern'=>$readConcern->getLevel(),'readPreference'=>$readPreference->getModeString()],
    'Manager после'=>$after,'Вывод'=>'Настройки вызова не изменяют настройки Manager. Единственный узел не доказывает маршрутизацию между репликами.'];
} finally {
    if ($owned) { ms122Command($manager,$database,['drop'=>$collection],true); }
}
$checks['owned_collection_removed']=!ms122Exists($manager,$database,$collection);
$details['Собственная удалённая коллекция']=$collection;
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-query-origin',['Артикул', 'Цена', 'Сервер результата', 'Режим вызова', 'Режим Manager после'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-query-origin: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-query-origin: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Замените только sku=CUP на sku=LAMP. В проекции останутся те же два поля, limit ограничит ответ одной карточкой, ожидаемая цена станет 1200. Переделывать Manager ради одного такого фильтра не требуется.

Практический вопрос: Global read preference vs query-level read preference. У клиента общий secondaryPreferred, а отдельное чтение должно иметь собственную политику. Пример разделяет default Manager, явные опции операции и фактический Server ответа; чужой API из обсуждения не переносится на PHP. Обсуждение определяет задачу; текущие контракты драйвера и правила выбора сверены с первичной документацией.

Изменить требование подтверждения одного вызова, сохранив настройки Manager

У приложения есть общий уровень подтверждения записи, а одну операцию нужно отправить с явным требованием журнала. Проверим не только значения объектов, но и подтверждённую вставку товара, сохранив исходные defaults.

Исходные данные

Manager с w=1 и journal=false. Для одной вставки PAID-CUP за 750 создаётся WriteConcern(1, 1500, true): подтверждение от узла, срок ожидания write concern 1500 мс и запрос journal. В собственной коллекции после записи читаются sku и price.

Путь данных и наблюдений
  1. Defaults Manager: w=1, journal=false
  2. Отдельный WriteConcern: w=1, journal=true
  3. executeBulkWrite получает его только для вставки
  4. Результат подтверждён; запрос находит PAID-CUP, 750
  5. getWriteConcern у Manager по-прежнему journal=false

Короткое действие

$callConcern = new MongoDB\Driver\WriteConcern(1, 1500, true);
$result = $manager->executeBulkWrite($namespace, $bulk, ['writeConcern'=>$callConcern]);
$stillDefault = $manager->getWriteConcern(); // прежняя настройка Manager

Видимый результат

Источник настройкиwjournal
Manager до1false
Только этот вызов1true
Manager после1false

Разбор результата

Возвращённый getWriteConcern объект описывает defaults Manager. Чтобы изменить условия конкретной записи, новый объект передаётся этой операции. В таблице сравниваются три реальные пары w/journal; в деталях — прочитанный товар и факт подтверждения. getJournal возвращает bool или NULL: false — явно выбранное значение, NULL — значение явно не задано. Этот пример специально задаёт false, чтобы различие было видно.

Ошибки и границы применения

journal=true не делает программу тестом переживания аварии: здесь не отключается питание, не проверяется восстановление и нет нескольких реплик. w=1 не обеспечивает majority на настоящем наборе реплик. wtimeout — срок ожидания нужного подтверждения, а не универсальный таймер всех сетевых действий и не автоматический откат записи. Имя PAID-CUP обозначает учебный товар, а не готовую платёжную систему.

Самостоятельная программа, helper и архив
Изменить требование подтверждения одного вызова, сохранив настройки ManagerСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database(['journal'=>false]);
$collection='mongodb122_server_'.bin2hex(random_bytes(8)); $namespace=$database.'.'.$collection; $owned=false;
if (ms122Exists($manager,$database,$collection)) { throw new RuntimeException('Unexpected collection collision'); }
try {
    ms122Command($manager,$database,['create'=>$collection],true); $owned=true;
$before=$manager->getWriteConcern();
$callConcern=new MongoDB\Driver\WriteConcern(1,1500,true);
$bulk=new MongoDB\Driver\BulkWrite; $bulk->insert(['_id'=>3,'sku'=>'PAID-CUP','price'=>750]);
$result=$manager->executeBulkWrite($namespace,$bulk,['writeConcern'=>$callConcern]);
$after=$manager->getWriteConcern();
$cursor=$manager->executeQuery($namespace,new MongoDB\Driver\Query(['_id'=>3],['projection'=>['_id'=>0,'sku'=>1,'price'=>1],'limit'=>1,'maxTimeMS'=>1000]));
$cursor->setTypeMap(['root'=>'array']); $documents=$cursor->toArray();
$rows=[['Manager до',$before->getW(),$before->getJournal()?'true':'false'],
    ['Только этот вызов',$callConcern->getW(),$callConcern->getJournal()?'true':'false'],
    ['Manager после',$after->getW(),$after->getJournal()?'true':'false']];
$checks=['manager_unchanged'=>$before->getW()===1 && $after->getW()===1 && $before->getJournal()===false && $after->getJournal()===false,
    'call_requests_journal'=>$callConcern->getJournal()===true && $callConcern->getWtimeout()===1500,
    'acknowledged_insert'=>$result->isAcknowledged() && $result->getInsertedCount()===1,
    'actual_saved_product'=>$documents===[['sku'=>'PAID-CUP','price'=>750]]];
$details=['Фактически прочитанный товар'=>$documents,'Подтверждение'=>$result->isAcknowledged(),
    'Граница'=>'Один успешный journaled-вызов не является испытанием восстановления после аварии. w=1 не означает несколько реплик.'];
} finally {
    if ($owned) { ms122Command($manager,$database,['drop'=>$collection],true); }
}
$checks['owned_collection_removed']=!ms122Exists($manager,$database,$collection);
$details['Собственная удалённая коллекция']=$collection;
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-write-defaults',['Источник настройки', 'w', 'journal'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-write-defaults: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-write-defaults: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Найдите, какой объект передан executeBulkWrite, и какой читает последующий getWriteConcern. Это разные настройки: per-call concern передан операции, а getter возвращает default Manager. Поэтому последняя строка таблицы остаётся false.

Не считать исправный standalone сломанным из-за isPrimary=false

Диагностическая страница показывает isPrimary=false, хотя обычные операции с базой работают. Вместо ошибочного сообщения «нет главного сервера» различим тип узла, способность принять запись и роль в replica set.

Исходные данные

Фактически выбранный Standalone. getInfo даёт доступное описание hello; поле isWritablePrimary, либо историческое имя ismaster, сообщает writable. Методы isPrimary/isSecondary/isArbiter/isHidden/isPassive относятся к ролям или свойствам replica set.

Путь данных и наблюдений
  1. Выбрать доступный Server
  2. getType: это Standalone
  3. Из hello получить writable=true
  4. Проверить пять признаков replica set: все false
  5. Показать отсутствие RS-тегов отдельно

Короткое действие

echo $server->getType();   // TYPE_STANDALONE
var_export($server->isPrimary()); // false: это НЕ primary-член replica set
$hello = $server->getInfo(); // описание последнего наблюдения

Видимый результат

ПризнакНаблюдаемое значение
Тип сервераStandalone
hello: writabletrue
isPrimaryfalse
isSecondaryfalse
isArbiterfalse
isHiddenfalse
isPassivefalse
RS tagsпусто

Разбор результата

Одиночный mongod может принимать запись, оставаясь не RSPrimary. Поэтому writable=true и isPrimary=false здесь не противоречат друг другу. isHidden означает скрытого члена replica set, isPassive — участника с приоритетом 0, isArbiter — арбитра, не хранящего пользовательские данные. Эти понятия не следует сводить к одной общей проверке «сервер хороший/плохой».

Ошибки и границы применения

getInfo — мониторинговое описание, а не транзакционная гарантия следующей операции. Не маршрутизируйте прикладную запись вручную по однажды прочитанному isPrimary: драйвер выбирает подходящий сервер для операции. На standalone мы честно проверяем отрицательные RS-признаки; положительные состояния hidden/arbiter/secondary и смена лидера в этом примере не воспроизводятся.

Самостоятельная программа, helper и архив
Не считать исправный standalone сломанным из-за isPrimary=falseСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database([]);
$server=$manager->selectServer(); $info=$server->getInfo(); $roles=ms122Roles($server);
$writable=(bool)($info['isWritablePrimary']??$info['ismaster']??false);
$rows=[['Тип сервера',ms122Type($server)],['hello: writable',$writable?'true':'false']];
foreach ($roles as $name=>$value) { $rows[]=[$name,$value?'true':'false']; }
$rows[]=['RS tags',$server->getTags()===[]?'пусто':'заданы'];
$description=$server->getServerDescription();
$checks=['standalone_type'=>$server->getType()===MongoDB\Driver\Server::TYPE_STANDALONE,
    'writable_hello'=>$writable,'all_rs_flags_false'=>$roles===['isPrimary'=>false,'isSecondary'=>false,'isArbiter'=>false,'isHidden'=>false,'isPassive'=>false],
    'no_replica_set_tags'=>$server->getTags()===[],'description_agrees'=>$description->getType()==='Standalone'];
$details=['Endpoint'=>ms122Endpoint($server),'Последний hello'=>$info,
    'Значение признаков'=>'isPrimary означает primary-члена replica set, а не произвольный сервер, который принимает обычную запись'];
$checks['readonly_no_collection_created']=true;
$details['Область работы']='Только диагностика и чтение служебных ответов; коллекции не создавались';
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-role-vs-writable',['Признак', 'Наблюдаемое значение'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-role-vs-writable: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-role-vs-writable: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Исправьте диагностическое правило «если !isPrimary, сервер недоступен». Направление решения: сначала покажите getType; для проверки доступности используйте реальную команду, а RS-роль выводите отдельным полем без подмены способности принять запрос.

Практический вопрос: Will an application written for standalone MongoDB work for replica-set or sharded cluster?. Переезд с одиночного mongod вызывает путаницу в ролях, URI и возможностях. Пример отделяет Standalone от RSPrimary и writable от RS-роли, не изображая тест репликации на одном standalone. Обсуждение определяет задачу; текущие контракты драйвера и правила выбора сверены с первичной документацией.

Сохранить снимок описания сервера для диагностического отчёта

Для отчёта об инциденте требуется сохранить описание узла на определённый момент, а затем получить новое описание. Нельзя ожидать, что ранее полученный value object сам станет свежим после следующей команды.

Исходные данные

Первый ServerDescription получается из выбранного Server. Сохраняются host, port, type и каноническое представление его hello. Затем реально выполняется ping и запрашивается новый ServerDescription.

Путь данных и наблюдений
  1. getServerDescription: снимок A
  2. Прочитать endpoint, type и hello A
  3. Сделать отдельный ping
  4. Снимок A остаётся прежним объектом-значением
  5. Снова getServerDescription: снимок B на момент нового вызова

Короткое действие

$snapshot = $server->getServerDescription();
$typeAtCapture = $snapshot->getType(); // строка "Standalone"
// Это сохранённое значение, не живое обещание будущей роли сервера.

Видимый результат

Состояние отчётаХостПортТип снимка
Снимок до ping127.0.0.127075Standalone
Тот же сохранённый снимок127.0.0.127075Standalone
Новый снимок после ping127.0.0.127075Standalone

Разбор результата

ServerDescription неизменяем: старое описание сохраняет полученные значения. Новое надо запрашивать отдельно. В нашем спокойном одиночном стенде A и B показывают один Standalone; программа не придумывает смену роли. Канонический JSON hello сравнивается для сохранённого A, чтобы не спутать смысл BSON-значений с идентичностью PHP-объектов. Server::getType возвращает int-константу, а ServerDescription::getType — строковое имя типа.

Ошибки и границы применения

Одинаковые снимки до и после ping не доказывают отсутствие промежуточных событий в реальном кластере. getLatency относится к измерению hello, а не времени между двумя снимками или длительности ping в нашем PHP-коде. На некоторых топологиях задержка может быть NULL; это следует показывать как неизвестное значение, а не ноль.

Самостоятельная программа, helper и архив
Сохранить снимок описания сервера для диагностического отчётаСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database([]);
$server=$manager->selectServer(); $snapshot=$server->getServerDescription();
$originalHello=MongoDB\BSON\Document::fromPHP($snapshot->getHelloResponse())->toCanonicalExtendedJSON();
$originalType=$snapshot->getType(); $originalHost=$snapshot->getHost(); $originalPort=$snapshot->getPort();
$rows=[['Снимок до ping',$originalHost,$originalPort,$originalType]];
ms122Command($manager,'admin',['ping'=>1]);
$fresh=$server->getServerDescription();
$rows[]=['Тот же сохранённый снимок',$snapshot->getHost(),$snapshot->getPort(),$snapshot->getType()];
$rows[]=['Новый снимок после ping',$fresh->getHost(),$fresh->getPort(),$fresh->getType()];
$latency=$server->getLatency();
$checks=['snapshot_value_unchanged'=>$originalHello===MongoDB\BSON\Document::fromPHP($snapshot->getHelloResponse())->toCanonicalExtendedJSON(),
    'same_observed_endpoint'=>$originalHost===$fresh->getHost() && $originalPort===$fresh->getPort(),
    'standalone_descriptions'=>$originalType==='Standalone' && $fresh->getType()==='Standalone',
    'latency_contract'=>$latency===null || (is_int($latency) && $latency>=0)];
$details=['Сохранённый hello'=>json_decode($originalHello,true,512,JSON_THROW_ON_ERROR),
    'Новый hello'=>$fresh->getHelloResponse(),'getLatency_ms'=>$latency,
    'Граница'=>'В этом запуске роль не менялась. Отсутствие изменений не является тестом failover; неизменяемость объекта следует контракту ServerDescription.'];
$checks['readonly_no_collection_created']=true;
$details['Область работы']='Только диагностика и чтение служебных ответов; коллекции не создавались';
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-description-snapshot',['Состояние отчёта', 'Хост', 'Порт', 'Тип снимка'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-description-snapshot: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-description-snapshot: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Для отчёта «до/после» сохраните два отдельных результата getServerDescription. Не заменяйте сохранённый A новым B. Если оба показывают Standalone, так и запишите; успешный пример не требует искусственно рисовать изменение топологии.

Проверить небольшую порцию по объявленным возможностям сервера

Перед импортом полезно объяснить оператору, почему нельзя отправить один бесконечно большой документ или считать весь файл одной неограниченной порцией. Прочитаем объявленные сервером ограничения и сопоставим их с конкретными данными.

Исходные данные

Учебный товар содержит sku=CUP и price=500; его реальный BSON-размер получаем через Document::fromPHP и strlen сырых BSON-байтов. План порции — три документа. getInfo поставляет наблюдаемые maxBsonObjectSize, maxWriteBatchSize и maxMessageSizeBytes.

Путь данных и наблюдений
  1. Сериализовать один товар в BSON
  2. Посчитать именно байты BSON
  3. Прочитать ограничения из hello
  4. Сравнить документ с maxBsonObjectSize и число 3 с maxWriteBatchSize
  5. Вывести значения и границы вывода

Короткое действие

$info = $server->getInfo();
$maxBytes = $info['maxBsonObjectSize'];
$latencyMs = $server->getLatency(); // hello RTT; это не время выполнения вашего find

Видимый результат

Что проверяемДанныеВывод по реальному hello
Товар CUPsku=CUP; price=500помещается в BSON-лимит
План порции3 документане превышает лимит числа операций
Тип подключенияStandaloneпроверены наблюдаемые ограничения

Разбор результата

Первое сравнение относится к одному BSON-документу, второе — к числу write-операций в серверной порции. Это разные размеры. В result.html раскрываются реальные числовые лимиты и число байтов товара; таблица показывает смысл результата. getLatency выводится отдельно: сетевой hello RTT не превращается в оценку скорости обработки прайса.

Ошибки и границы применения

Эта программа не вставляет три товара, не испытывает максимальный размер сообщения и не подменяет упаковку/разбиение команд самим драйвером. Накладные расходы wire protocol не равны сумме strlen товаров. Предварительная оценка не отменяет обработку серверной ошибки. В load-balanced режиме getInfo и getType могут описывать разные уровни подключения; специальный случай подробно указан в карточке getInfo.

Самостоятельная программа, helper и архив
Проверить небольшую порцию по объявленным возможностям сервераСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database([]);
$server=$manager->selectServer(); $info=$server->getInfo();
$product=['sku'=>'CUP','price'=>500]; $bsonBytes=strlen((string)MongoDB\BSON\Document::fromPHP($product));
$plannedDocuments=3;
$maxBson=$info['maxBsonObjectSize']??null; $maxBatch=$info['maxWriteBatchSize']??null;
if (!is_int($maxBson) || !is_int($maxBatch) || $maxBson<=0 || $maxBatch<=0) { throw new RuntimeException('Expected positive hello capabilities'); }
$fitsDocument=$bsonBytes<=$maxBson; $fitsCount=$plannedDocuments<=$maxBatch;
$latency=$server->getLatency();
$rows=[['Товар CUP','sku=CUP; price=500',$fitsDocument?'помещается в BSON-лимит':'слишком велик'],
    ['План порции','3 документа',$fitsCount?'не превышает лимит числа операций':'нужно разбить'],
    ['Тип подключения',ms122Type($server),'проверены наблюдаемые ограничения']];
$checks=['document_fits'=>$fitsDocument,'planned_count_fits'=>$fitsCount,
    'latency_contract'=>$latency===null || (is_int($latency) && $latency>=0),
    'actual_hello'=>array_key_exists('maxMessageSizeBytes',$info) && $server->getType()===MongoDB\Driver\Server::TYPE_STANDALONE];
$details=['Байты BSON товара'=>$bsonBytes,'maxBsonObjectSize'=>$maxBson,'maxWriteBatchSize'=>$maxBatch,
    'maxMessageSizeBytes'=>$info['maxMessageSizeBytes'],'getLatency_ms'=>$latency,
    'Не проверено'=>'Вставка этой порции, расходы полного wire message и максимальная производительность. Это предварительная диагностика, не ручной заменитель упаковки драйвера.'];
$checks['readonly_no_collection_created']=true;
$details['Область работы']='Только диагностика и чтение служебных ответов; коллекции не создавались';
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-server-capabilities',['Что проверяем', 'Данные', 'Вывод по реальному hello'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-server-capabilities: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-server-capabilities: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Добавьте к учебному товару описание и снова сравните фактическое число BSON-байтов. Сохраняйте ключи и типы документа, не считайте размер по количеству PHP-элементов. Для следующего шага используйте главу о пакетной записи и её реальных результатах.

Приложить к экрану товаров фактический endpoint и честную диагностику

Пользователь видит два товара и сообщает о странном ответе. Подготовим компактное воспроизводимое описание запроса и сервера, не выгружая всю базу и не объявляя сетевую задержку причиной любой проблемы.

Исходные данные

CUP за 500, LAMP за 1200 и MAT за 300. Для экрана нужны товары от 500: только sku и price, сортировка по price/sku, limit=2. Manager явно задаёт readConcern local, остальные нужные defaults читаются из его объектов.

Путь данных и наблюдений
  1. Фильтр price >= 500 выполняется в MongoDB
  2. Проекция, sort и limit ограничивают ответ
  3. Cursor возвращает CUP и LAMP
  4. Cursor::getServer связывает строки с фактическим endpoint
  5. Отдельно приложить defaults, роли, теги, снимок и hello RTT

Короткое действие

$server = $cursor->getServer();
$diagnostics = ['host'=>$server->getHost(), 'port'=>$server->getPort(),
    'type'=>$server->getType(), 'helloLatencyMs'=>$server->getLatency()];
// Поля данных выбираются в запросе; диагностика относится к серверу этого Cursor.

Видимый результат

АртикулЦенаФактический хостПортТип
CUP500127.0.0.127075Standalone
LAMP1200127.0.0.127075Standalone

Разбор результата

Две строки строятся из реального ответа базы. Host/port/type берутся у Server этого Cursor; getServers служит дополнительным описанием известной топологии. Таблица не сортируется после загрузки всех товаров в PHP. В раскрывающемся блоке отдельно показаны запрос, defaults Manager, отрицательные RS-признаки и фактический snapshot. Это данные для диагностики, а не публичный отчёт для всех посетителей сайта.

Ошибки и границы применения

Данные hello могут раскрывать внутренние адреса и параметры инфраструктуры: в рабочем приложении доступ к такой диагностике ограничивают. URI с паролем вообще не следует печатать. Один короткий запрос не измеряет нагрузку; latency не доказывает его медленную или быструю обработку. Список getServers и снимок актуальны на момент наблюдения, последующие запросы в replica set могут обслуживаться иначе.

Самостоятельная программа, helper и архив
Приложить к экрану товаров фактический endpoint и честную диагностикуСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/ms122-helper.php';
$runtime=ms122Runtime();
[$manager,$database]=ms122Database(['readConcernLevel'=>'local']);
$collection='mongodb122_server_'.bin2hex(random_bytes(8)); $namespace=$database.'.'.$collection; $owned=false;
if (ms122Exists($manager,$database,$collection)) { throw new RuntimeException('Unexpected collection collision'); }
try {
    ms122Command($manager,$database,['create'=>$collection],true); $owned=true;
ms122Seed($manager,$namespace,[['_id'=>1,'sku'=>'CUP','price'=>500],['_id'=>2,'sku'=>'LAMP','price'=>1200],['_id'=>3,'sku'=>'MAT','price'=>300]]);
$cursor=$manager->executeQuery($namespace,new MongoDB\Driver\Query(['price'=>['$gte'=>500]],
    ['projection'=>['_id'=>0,'sku'=>1,'price'=>1],'sort'=>['price'=>1,'sku'=>1],'limit'=>2,'maxTimeMS'=>1000]));
$cursor->setTypeMap(['root'=>'array']); $documents=$cursor->toArray(); $server=$cursor->getServer();
$rows=[]; foreach ($documents as $document) { $rows[]=[$document['sku'],$document['price'],$server->getHost(),$server->getPort(),ms122Type($server)]; }
$roles=ms122Roles($server); $latency=$server->getLatency(); $snapshot=$server->getServerDescription();
$known=$manager->getServers(); $tags=$server->getTags(); $policies=ms122Policies($manager);
$checks=['bounded_screen'=>$documents===[['sku'=>'CUP','price'=>500],['sku'=>'LAMP','price'=>1200]],
    'one_known_endpoint'=>count($known)===1 && ms122Endpoint($known[0])===ms122Endpoint($server),
    'standalone_not_rs'=>$roles===['isPrimary'=>false,'isSecondary'=>false,'isArbiter'=>false,'isHidden'=>false,'isPassive'=>false],
    'empty_actual_tags'=>$tags===[],'snapshot_matches'=>$snapshot->getType()==='Standalone',
    'latency_contract'=>$latency===null || (is_int($latency) && $latency>=0),
    'configured_policy'=>$policies['readPreference']==='primary' && $policies['readConcern']==='local' && $policies['w']===1];
$details=['Фильтр'=>['price'=>['$gte'=>500]],'Проекция/сортировка/лимит'=>['fields'=>['sku','price'],'sort'=>['price'=>1,'sku'=>1],'limit'=>2],
    'RS-признаки фактического сервера'=>$roles,'Теги'=>$tags,'Настройки Manager'=>$policies,
    'getLatency_ms'=>$latency,'Снимок hello'=>$snapshot->getHelloResponse(),
    'Не делаем вывод'=>'Две строки не являются измерением нагрузки, latency не является длительностью их получения, вторичная реплика не испытывалась'];
} finally {
    if ($owned) { ms122Command($manager,$database,['drop'=>$collection],true); }
}
$checks['owned_collection_removed']=!ms122Exists($manager,$database,$collection);
$details['Собственная удалённая коллекция']=$collection;
$runtime['server']=ms122Command($manager,'admin',['buildInfo'=>1])[0]['version'];
ms122Report('mongodb122-server-diagnostic-report',['Артикул', 'Цена', 'Фактический хост', 'Порт', 'Тип'],$rows,$checks,$runtime,$details);
echo 'mongodb122-server-diagnostic-report: saved result.html and result.json
';
Ожидаемый результат
mongodb122-server-diagnostic-report: saved result.html and result.json

Запустите php example.php на отдельном локальном Standalone MongoDB. Все данные и настройки описаны в README; таблица строится из настоящих ответов. Программа изменяет только собственную коллекцию там, где это прямо указано, и удаляет её в finally.

Открыть реальную таблицу и диагностику · Строки JSON

Упражнение и направление решения. Добавьте товар BOOK за 800. При том же фильтре и сортировке первые две строки должны стать CUP и BOOK, а LAMP уйдёт за limit. Endpoint останется фактическим свойством Cursor, а не ручной характеристикой товара.

Пять методов Manager и двенадцать методов Server

В карточках сохранены полные сигнатуры, параметры, возвращаемые типы, ошибки, изменения версий и два применения в самостоятельных программах. Положительные роли replica set не выдаются за испытанные на Standalone.

МетодПрактическая задача
MongoDB\Driver\Manager::getReadConcernУзнать read concern, заданный по умолчанию в Manager.
MongoDB\Driver\Manager::getReadPreferenceПрочитать правило выбора сервера, заданное в Manager.
MongoDB\Driver\Manager::getWriteConcernПроверить default подтверждения записи до и после отдельного вызова.
MongoDB\Driver\Manager::getServersПолучить уже известные драйверу описания серверов.
MongoDB\Driver\Manager::selectServerВыбрать доступный сервер по заданной политике в текущей топологии.
MongoDB\Driver\Server::getHostУзнать хост узла, который действительно выбран или обслужил Cursor.
MongoDB\Driver\Server::getPortУзнать порт конкретного MongoDB Server.
MongoDB\Driver\Server::getLatencyПрочитать задержку hello, не подменяя ею длительность пользовательского запроса.
MongoDB\Driver\Server::getInfoПрочитать сведения hello для диагностики роли и ограничений.
MongoDB\Driver\Server::getServerDescriptionЗафиксировать неизменяемое описание сервера на момент вызова.
MongoDB\Driver\Server::getTagsПоказать теги члена replica set и корректно обработать их отсутствие.
MongoDB\Driver\Server::getTypeРазличить Standalone, реплику, маршрутизатор и неизвестный узел.
MongoDB\Driver\Server::isPrimaryПроверить признак primary-узла replica set.
MongoDB\Driver\Server::isSecondaryПроверить признак secondary-узла replica set.
MongoDB\Driver\Server::isArbiterПроверить признак арбитра replica set.
MongoDB\Driver\Server::isHiddenПроверить признак скрытого члена replica set.
MongoDB\Driver\Server::isPassiveПроверить признак члена replica set с приоритетом 0.

Сохранить полезный отчёт и перейти к работе с ответом

Для диагностического отчёта сначала сохраните нужные данные запроса и фактический Server его Cursor. Defaults Manager записывайте отдельно от per-call опций. Тип, RS-роли, теги и снимок помогают объяснить окружение, но не заменяют обработку ошибок реальной операции. Не переносите поведение Single на replica set без учёта правил выбора.

Следующие связанные шаги: читать Cursor порциями и сохранять место обхода, проверять read/write concern на replica set, согласовывать многодокументные действия транзакцией, получать понятную квитанцию записи. Если запрос медленный, исследуйте его фильтр, индекс, объём результата и план; одна величина hello RTT не отвечает на эти вопросы.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

MongoDB\Driver\Manager::getReadConcernУзнать read concern, заданный по умолчанию в Manager.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Manager::getReadConcern(): MongoDB\Driver\ReadConcern

Узнать read concern, заданный по умолчанию в Manager.

final public MongoDB\Driver\Manager::getReadConcern(): MongoDB\Driver\ReadConcern

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Возвращает объект ReadConcern из URI и опций конструктора Manager. Он описывает default для запросов и команд, к которым применим read concern. Его getLevel() может вернуть NULL, если уровень явно не задан.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Read concern отвечает за видимость данных, не за выбор primary/secondary. Getter не выясняет все серверные defaults и не доказывает, какой уровень фактически установит сервер, когда клиент не указал его. Нельзя интерпретировать NULL как отсутствие соединения.

Версии

Метод существует с ext-mongodb 1.0.0.

Проверить явно заданный local

$level = $manager->getReadConcern()->getLevel(); // local

Конфигурация local сохраняется после пяти выборов сервера.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не перепутать уровень одного Query с default

$before = $manager->getReadConcern()->getLevel(); // NULL
// Query получает собственный ReadConcern(local).
$after = $manager->getReadConcern()->getLevel(); // снова NULL

Запрос CUP применяет свой объект, не меняя конфигурацию Manager.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Manager::getReadPreferenceПрочитать правило выбора сервера, заданное в Manager.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Manager::getReadPreference(): MongoDB\Driver\ReadPreference

Прочитать правило выбора сервера, заданное в Manager.

final public MongoDB\Driver\Manager::getReadPreference(): MongoDB\Driver\ReadPreference

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Возвращает ReadPreference из URI/опций Manager. Для имени режима используйте getModeString(); теги и другие параметры доступны через методы этого объекта.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Это описание настройки, а не ответ на вопрос, какой сервер обслужил конкретный результат. Для последнего нужен Cursor::getServer. В ext-mongodb 2.x старый getMode() удалён; здесь применяется getModeString(). Параметр selectServer по умолчанию имеет собственное правило primary.

Версии

Метод существует с ext-mongodb 1.0.0.

Сохранить secondaryPreferred как общий default

echo $manager->getReadPreference()->getModeString(); // secondaryPreferred

Явные selectServer с разными объектами не изменяют этот default.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Отделить общий default от одного primary-запроса

$defaults = $manager->getReadPreference();
$cursor = $manager->executeQuery($namespace, $query,
    ['readPreference'=>new MongoDB\Driver\ReadPreference('primary')]);

CUP получен с явно переданной политикой вызова; default остаётся secondaryPreferred.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Manager::getWriteConcernПроверить default подтверждения записи до и после отдельного вызова.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Manager::getWriteConcern(): MongoDB\Driver\WriteConcern

Проверить default подтверждения записи до и после отдельного вызова.

final public MongoDB\Driver\Manager::getWriteConcern(): MongoDB\Driver\WriteConcern

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Возвращает объект WriteConcern, построенный из URI и опций Manager. Он применяется к операциям записи и поддерживающим write concern командам, если их настройки не переопределены подходящим способом.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Getter не является квитанцией записи: её даёт результат исполненной операции. NULL у отдельных свойств concern означает, что они явно не заданы. Не обещайте сохранность после аварии только потому, что объект содержит journal=true или w=majority.

Версии

Метод существует с ext-mongodb 1.0.0.

Увидеть w/journal до и после per-call journal=true

$before = $manager->getWriteConcern(); // w=1, journal=false
// executeBulkWrite(..., ['writeConcern'=>$perCall])
$after = $manager->getWriteConcern(); // те же defaults

Подтверждён PAID-CUP; общий Manager не был перенастроен.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Зафиксировать политику, рядом с которой сделан экран

$wc = $manager->getWriteConcern();
$configured = ['w'=>$wc->getW(), 'journal'=>$wc->getJournal()];

В диагностике виден фактический default w=1; он не выдаётся за read concern этого find.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Manager::getServersПолучить уже известные драйверу описания серверов.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Manager::getServers(): array

Получить уже известные драйверу описания серверов.

final public MongoDB\Driver\Manager::getServers(): array

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Массив объектов MongoDB\Driver\Server для серверов, известных Manager. До первого взаимодействия может быть пустым: соединение создаётся лениво. Возвращается не массив документов пользовательской коллекции.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Сам вызов не заставляет Manager соединиться или обнаружить серверы. Если нужен выбор подходящего доступного сервера, используют selectServer; если проверяют конкретную операцию — выполняют её. Это наблюдаемая топология клиента, а не инвентаризация всего оборудования организации.

Версии

Метод существует с ext-mongodb 1.0.0.

Отличить отсутствие сведений до соединения от отказа ping

$before = $manager->getServers();
$cursor = $manager->executeReadCommand($database, new MongoDB\Driver\Command(['ping'=>1]));
$after = $manager->getServers();

После реальной команды в этом стенде известен один Standalone.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Сопоставить топологию с сервером конкретного экрана

$known = $manager->getServers();
$actual = $cursor->getServer(); // источник двух строк

Проверяется совпадение единственного известного endpoint и Server результата.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Manager::selectServerВыбрать доступный сервер по заданной политике в текущей топологии.

Доступен с ext-mongodb 1.0.0. С версии 1.11.0 readPreference необязателен и допускает NULL; раньше аргумент требовался. · mongodb

final public MongoDB\Driver\Manager::selectServer(?MongoDB\Driver\ReadPreference $readPreference = null): MongoDB\Driver\Server

Выбрать доступный сервер по заданной политике в текущей топологии.

final public MongoDB\Driver\Manager::selectServer(?MongoDB\Driver\ReadPreference $readPreference = null): MongoDB\Driver\Server

Параметры

readPreference — объект MongoDB\Driver\ReadPreference либо NULL. По умолчанию NULL означает primary. Объект передаёт правило данного выбора, но не изменяет defaults Manager.

Возвращаемое значение

Возвращает подходящий MongoDB\Driver\Server. В отличие от getServers, при необходимости выполняет подключение и обнаружение. Выбор относится к моменту вызова, а не к вечному закреплению всех будущих операций.

Ошибки и ограничения

InvalidArgumentException при неверных аргументах; ConnectionException при проблеме установления соединения, AuthenticationException при ошибке аутентификации, RuntimeException, если подходящий сервер выбрать не удалось. Это реальные классы драйвера MongoDB\Driver\Exception; предел ожидания выбора задаётся конфигурацией Manager, например serverSelectionTimeoutMS.

При NULL или отсутствии аргумента применяется primary, а не автоматически default Manager. Для replica set режимы имеют правила выбора ролей и тегов; у Single доступный единственный сервер подходит независимо от read preference. Не превращайте getLatency в ручную замену алгоритму выбора и не считайте объект Server гарантией отсутствия будущего сетевого отказа.

Версии

Доступен с ext-mongodb 1.0.0. С версии 1.11.0 readPreference необязателен и допускает NULL; раньше аргумент требовался.

Проверить значение режима в топологии Single

$preference = new MongoDB\Driver\ReadPreference('secondary');
$server = $manager->selectServer($preference);

На прямом standalone выбирается доступный единственный узел; это не secondary replica.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Получить источник серверных лимитов

$server = $manager->selectServer();
$hello = $server->getInfo();

К ограничениям привязаны host/port/type реального выбранного узла.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getHostУзнать хост узла, который действительно выбран или обслужил Cursor.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::getHost(): string

Узнать хост узла, который действительно выбран или обслужил Cursor.

final public MongoDB\Driver\Server::getHost(): string

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Строка с именем хоста сервера. Значение описывает Server, а не обязательно буквально повторяет seed из исходного URI: при обнаружении топологии адреса могут определяться её описанием.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Для полного сетевого endpoint обычно нужен также getPort. Не выдавайте внутренние адреса всем посетителям сайта. Строка хоста сама не удостоверяет доступность будущего запроса и не сообщает роль replica set.

Версии

Метод существует с ext-mongodb 1.0.0.

Показать хост ответа ping

$server = $cursor->getServer();
echo $server->getHost(); // 127.0.0.1 на данном стенде

Адрес получен после настоящего обмена.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Привязать карточку CUP к её ответившему серверу

$host = $cursor->getServer()->getHost();

Хост входит в диагностическую строку рядом с ценой, а не подставляется из поля товара.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getPortУзнать порт конкретного MongoDB Server.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::getPort(): int

Узнать порт конкретного MongoDB Server.

final public MongoDB\Driver\Server::getPort(): int

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Целое число — порт сервера. Это порт выбранного объекта Server, не PHP HTTP-порт и не значение цены или иного поля документа.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

На одном хосте могут работать разные экземпляры на разных портах. Для IPv6 текстовое построение сетевого адреса требует скобок; в этих программах используется известный IPv4 loopback. Не считайте совпадение номера порта достаточным доказательством, что это нужная база.

Версии

Метод существует с ext-mongodb 1.0.0.

Отличить учебный 27075 от другого локального mongod

echo $cursor->getServer()->getPort(); // 27075

Таблица ping явно показывает порт отдельного стенда.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Включить порт фактического источника двух товаров

$server = $cursor->getServer();
$endpoint = $server->getHost().':'.$server->getPort();

Отчёт связывает CUP и LAMP с 127.0.0.1:27075.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getLatencyПрочитать задержку hello, не подменяя ею длительность пользовательского запроса.

Доступен с ext-mongodb 1.0.0. С 1.11.0 результат nullable: при неизвестной задержке возвращается NULL; в более старых версиях могла возвращаться величина -1. · mongodb

final public MongoDB\Driver\Server::getLatency(): ?int

Прочитать задержку hello, не подменяя ею длительность пользовательского запроса.

final public MongoDB\Driver\Server::getLatency(): ?int

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Целое число миллисекунд round-trip time команды hello либо NULL, если задержка неизвестна. Например, у Server в load-balanced режиме она не измеряется обычным способом и может отсутствовать.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Это не время find, сортировки, выполнения PHP, полного импорта или подключения браузера. NULL показывают как неизвестность, не как 0 мс. Фактическое число зависит от окружения, поэтому программа проверяет тип/диапазон и сохраняет измерение, а не требует стабильного golden-числа.

Версии

Доступен с ext-mongodb 1.0.0. С 1.11.0 результат nullable: при неизвестной задержке возвращается NULL; в более старых версиях могла возвращаться величина -1.

Приложить наблюдаемое RTT к снимку

$latencyMs = $server->getLatency();
$label = $latencyMs === null ? 'неизвестно' : $latencyMs.' мс';

Реальное число находится в деталях result.html, не зафиксировано в ожидаемой таблице.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не спутать доступность малого RTT с производительностью импорта

$hello = $server->getInfo();
$rtt = $server->getLatency(); // отдельная диагностическая величина

Лимиты BSON и число операций обсуждаются отдельно от сетевой задержки.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getInfoПрочитать сведения hello для диагностики роли и ограничений.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::getInfo(): array

Прочитать сведения hello для диагностики роли и ограничений.

final public MongoDB\Driver\Server::getInfo(): array

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

PHP-массив последнего доступного ответа hello, полученного мониторингом сервера. Состав полей зависит от версии и типа MongoDB; проверяйте наличие и тип нужного поля.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

В load-balanced режиме метод возвращает hello серверной стороны соединения, которое установил драйвер, тогда как getType описывает load balancer. Не ожидайте одинакового уровня описания в этих методах. Поля ismaster/isWritablePrimary отражают историческое именование; отсутствующие ключи не следует читать вслепую. Здесь не выполняется новая команда hello вручную и не моделируется балансировщик.

Версии

Метод существует с ext-mongodb 1.0.0.

Различить writable и роль RSPrimary

$hello = $server->getInfo();
$writable = (bool)($hello['isWritablePrimary'] ?? $hello['ismaster'] ?? false);

Standalone показывает writable=true при isPrimary=false.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Сопоставить документ с объявленным ограничением

$hello = $server->getInfo();
$maxBytes = $hello['maxBsonObjectSize'];

Фактический BSON-размер CUP сравнивается с прочитанным лимитом.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getServerDescriptionЗафиксировать неизменяемое описание сервера на момент вызова.

Метод появился в ext-mongodb 1.13.0. Программы главы рассчитаны на ext-mongodb 2.5+; сам метод не требует MongoDB 8.0. · mongodb

final public MongoDB\Driver\Server::getServerDescription(): MongoDB\Driver\ServerDescription

Зафиксировать неизменяемое описание сервера на момент вызова.

final public MongoDB\Driver\Server::getServerDescription(): MongoDB\Driver\ServerDescription

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Новый объект-значение ServerDescription со сведениями о сервере, доступными на момент вызова. Он неизменяем и не обновляется вместе с последующими изменениями внутреннего мониторингового состояния Server.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Server::getType возвращает int-константу, а ServerDescription::getType — строку. Не сравнивайте их напрямую строгим равенством. Одинаковые снимки в этом стенде не являются тестом failover; для исторического отчёта храните момент наблюдения и нужные значения, а не только переменную Server.

Версии

Метод появился в ext-mongodb 1.13.0. Программы главы рассчитаны на ext-mongodb 2.5+; сам метод не требует MongoDB 8.0.

Сохранить два независимых наблюдения

$before = $server->getServerDescription();
// Между наблюдениями действительно выполняется ping.
$after = $server->getServerDescription();

Старый снимок остаётся прежним; новый запрашивается отдельно.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Приложить описание к конкретному экрану

$snapshot = $cursor->getServer()->getServerDescription();
$typeName = $snapshot->getType(); // Standalone

Отчёт получает снимок от Server фактического Cursor.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getTagsПоказать теги члена replica set и корректно обработать их отсутствие.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::getTags(): array

Показать теги члена replica set и корректно обработать их отсутствие.

final public MongoDB\Driver\Server::getTags(): array

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Ассоциативный массив строковых ключей и строковых значений тегов сервера. Если тегов нет, возвращается пустой массив. Это не поля товаров и не пользовательские labels документов.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Теги используют вместе с правилами ReadPreference в подходящей топологии replica set. Этот getter лишь читает их; он не назначает теги и не меняет конфигурацию сервера. На одиночном стенде не проверяется подбор реплики по тегам; пустой массив здесь — полноценное фактическое наблюдение.

Версии

Метод существует с ext-mongodb 1.0.0.

Не приписывать standalone несуществующую зону

$tags = $server->getTags(); // [] на данном Standalone

Все пять выборов имеют пустые теги; программа не придумывает region.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Приложить фактические теги к источнику экрана

$diagnostics['tags'] = $cursor->getServer()->getTags();

В раскрываемой диагностике явно виден пустой массив.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::getTypeРазличить Standalone, реплику, маршрутизатор и неизвестный узел.

Метод доступен с ext-mongodb 1.0.0. Набор констант расширялся; TYPE_LOAD_BALANCER добавлена в 1.11.0. Для программы на старом расширении сначала сверяйте доступность требуемой константы. · mongodb

final public MongoDB\Driver\Server::getType(): int

Различить Standalone, реплику, маршрутизатор и неизвестный узел.

final public MongoDB\Driver\Server::getType(): int

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

Целое значение одной из констант MongoDB\Driver\Server::TYPE_*. Используйте именованные константы, а человеку показывайте объясняющее название, не голое число.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Константы: TYPE_UNKNOWN — неизвестен; TYPE_STANDALONE — одиночный mongod; TYPE_MONGOS — маршрутизатор; TYPE_POSSIBLE_PRIMARY — возможный primary; TYPE_RS_PRIMARY — primary replica set; TYPE_RS_SECONDARY — secondary; TYPE_RS_ARBITER — арбитр; TYPE_RS_OTHER — другой член; TYPE_RS_GHOST — узел replica set без полного описания; TYPE_LOAD_BALANCER — балансировщик. Наличие всех названий в справочнике не означает, что этот стенд воспроизводит каждую топологию. ServerDescription::getType возвращает строковое имя, это другой тип результата.

Версии

Метод доступен с ext-mongodb 1.0.0. Набор констант расширялся; TYPE_LOAD_BALANCER добавлена в 1.11.0. Для программы на старом расширении сначала сверяйте доступность требуемой константы.

Объяснить isPrimary=false у доступного standalone

$standalone = $server->getType() === MongoDB\Driver\Server::TYPE_STANDALONE;

Тип Standalone делает сочетание writable=true/RSPrimary=false понятным.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Проверить фактический тип при каждом режиме

$server = $manager->selectServer(new MongoDB\Driver\ReadPreference('secondary'));
$type = $server->getType(); // TYPE_STANDALONE на нашем Single

Название режима не подменяет реально обнаруженный тип.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::isPrimaryПроверить признак primary-узла replica set.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::isPrimary(): bool

Проверить признак primary-узла replica set.

final public MongoDB\Driver\Server::isPrimary(): bool

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

true, если Server является primary в replica set; иначе false.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Standalone способен принимать запись, но не становится RSPrimary. Для проверки доступности нужен запрос, а не отрицание этого флага. Положительное состояние этого флага в данной главе не воспроизводится: наш стенд одиночный. Флаг основан на доступном описании узла и не гарантирует его неизменность до следующего обращения. Для нормальной маршрутизации операций применяют Manager и поддерживаемые политики выбора.

Версии

Метод существует с ext-mongodb 1.0.0.

Разобрать роль доступного Standalone

$flag = $server->isPrimary(); // false в этом запуске

В таблице отдельно показан isPrimary=false при доступном writable Standalone.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не объявить роль по имени настройки

$flag = $cursor->getServer()->isPrimary();

Диагностика двух реально полученных товаров записывает фактическое false для isPrimary.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::isSecondaryПроверить признак secondary-узла replica set.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::isSecondary(): bool

Проверить признак secondary-узла replica set.

final public MongoDB\Driver\Server::isSecondary(): bool

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

true, если Server является secondary в replica set; иначе false.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

ReadPreference secondary и isSecondary — разные вещи: первый задаёт выбор, второй описывает узел. На Single выбранный standalone не становится secondary. Положительное состояние этого флага в данной главе не воспроизводится: наш стенд одиночный. Флаг основан на доступном описании узла и не гарантирует его неизменность до следующего обращения. Для нормальной маршрутизации операций применяют Manager и поддерживаемые политики выбора.

Версии

Метод существует с ext-mongodb 1.0.0.

Разобрать роль доступного Standalone

$flag = $server->isSecondary(); // false в этом запуске

В таблице отдельно показан isSecondary=false при доступном writable Standalone.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не объявить роль по имени настройки

$flag = $cursor->getServer()->isSecondary();

Диагностика двух реально полученных товаров записывает фактическое false для isSecondary.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::isArbiterПроверить признак арбитра replica set.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::isArbiter(): bool

Проверить признак арбитра replica set.

final public MongoDB\Driver\Server::isArbiter(): bool

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

true, если Server является арбитром replica set; иначе false.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Арбитр участвует в выборах, но не хранит пользовательские данные. Не используйте его как источник карточек каталога; сам флаг не является способом отправки команды. Положительное состояние этого флага в данной главе не воспроизводится: наш стенд одиночный. Флаг основан на доступном описании узла и не гарантирует его неизменность до следующего обращения. Для нормальной маршрутизации операций применяют Manager и поддерживаемые политики выбора.

Версии

Метод существует с ext-mongodb 1.0.0.

Разобрать роль доступного Standalone

$flag = $server->isArbiter(); // false в этом запуске

В таблице отдельно показан isArbiter=false при доступном writable Standalone.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не объявить роль по имени настройки

$flag = $cursor->getServer()->isArbiter();

Диагностика двух реально полученных товаров записывает фактическое false для isArbiter.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::isHiddenПроверить признак скрытого члена replica set.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::isHidden(): bool

Проверить признак скрытого члена replica set.

final public MongoDB\Driver\Server::isHidden(): bool

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

true, если Server описывает hidden member replica set; иначе false.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Hidden — свойство конфигурации члена replica set, не скрытое поле документа и не признак секретности URI. Getter не делает узел скрытым. Положительное состояние этого флага в данной главе не воспроизводится: наш стенд одиночный. Флаг основан на доступном описании узла и не гарантирует его неизменность до следующего обращения. Для нормальной маршрутизации операций применяют Manager и поддерживаемые политики выбора.

Версии

Метод существует с ext-mongodb 1.0.0.

Разобрать роль доступного Standalone

$flag = $server->isHidden(); // false в этом запуске

В таблице отдельно показан isHidden=false при доступном writable Standalone.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не объявить роль по имени настройки

$flag = $cursor->getServer()->isHidden();

Диагностика двух реально полученных товаров записывает фактическое false для isHidden.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

MongoDB\Driver\Server::isPassiveПроверить признак члена replica set с приоритетом 0.

Метод существует с ext-mongodb 1.0.0. · mongodb

final public MongoDB\Driver\Server::isPassive(): bool

Проверить признак члена replica set с приоритетом 0.

final public MongoDB\Driver\Server::isPassive(): bool

Параметры

Параметров нет. Метод вызывают у существующего объекта; возвращаемое значение сохраняют в переменную или читают сразу.

Возвращаемое значение

true, если Server описывает passive member replica set с priority 0; иначе false.

Ошибки и ограничения

MongoDB\Driver\Exception\InvalidArgumentException при неверных аргументах вызова. Отдельный серверный запрос для этого getter не описан; полученное значение относится к имеющейся конфигурации или мониторинговому состоянию.

Priority 0 относится к участию в выборе primary, а не к состоянию «процесс спит» или «на нём нет запросов». Это отдельный признак, который не заменяет isSecondary. Положительное состояние этого флага в данной главе не воспроизводится: наш стенд одиночный. Флаг основан на доступном описании узла и не гарантирует его неизменность до следующего обращения. Для нормальной маршрутизации операций применяют Manager и поддерживаемые политики выбора.

Версии

Метод существует с ext-mongodb 1.0.0.

Разобрать роль доступного Standalone

$flag = $server->isPassive(); // false в этом запуске

В таблице отдельно показан isPassive=false при доступном writable Standalone.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Не объявить роль по имени настройки

$flag = $cursor->getServer()->isPassive();

Диагностика двух реально полученных товаров записывает фактическое false для isPassive.

Исходные данные и самостоятельная программа · Реальная таблица и диагностика

Что различать: Manager, Server и снимок · Cursor и сервер конкретного ответа

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.