<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mongodb.architecture.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'mongodb.connection-handling.php',
    1 => 'Соединения',
    2 => 'Обработка и сохранение соединения',
  ),
  'up' => 
  array (
    0 => 'mongodb.architecture.php',
    1 => 'Архитектура и внутреннее устройство драйвера',
  ),
  'prev' => 
  array (
    0 => 'mongodb.overview.php',
    1 => 'Архитектура',
  ),
  'next' => 
  array (
    0 => 'mongodb.persistence.php',
    1 => 'Сохранение данных',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/mongodb/architecture.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mongodb.connection-handling" class="section">
  
  <h2 class="title">Обработка и сохранение соединения</h2>

  
<blockquote class="note"><p><strong class="note">Замечание</strong>: 
 <span class="simpara">
  На платформах Unix модуль чувствителен к сценариям, которые используют
  системный вызов fork() без последующего вызова exec(). Пользователям не рекомендуется
  переиспользовать экземпляр класса <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>
  в дочернем процессе.
  child process.
 </span>
</p></blockquote>


  <div class="section">
   <h2 class="title">Сохранение соединения и топологии (версия PHP начиная с 1.2.0)</h2>

   <p class="para">
    Каждая версия модуля начиная с 1.2.0 сохраняет клиентский объект
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a>
    в рабочем процессе PHP, что позволяет ему повторно использовать соединения с базой данных,
    состояния аутентификации <em>и</em> информацию о топологии в
    нескольких запросах.
   </p>

   <p class="para">
    Когда вызывается метод <span class="methodname"><a href="mongodb-driver-manager.construct.php" class="methodname">MongoDB\Driver\Manager::__construct()</a></span>,
    из его аргументов создаётся хеш (т. е. строка URI и параметры
    массива). Модуль попытается найти ранее сохранённый клиентский объект
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> для
    этого хеша. Если существующий клиент не может быть найден для хеша, будет создан
    новый клиент и сохранён для будущего использования. Это поведение можно выключить
    через параметр драйвера <code class="literal">&quot;disableClientPersistence&quot;</code>.
   </p>

   <p class="para">
    Каждый клиент содержит свои собственные подключения к базе данных и представление
    топологии сервера (например, автономный, набор реплик, кластер сегментов). Сохраняя
    клиент между PHP-запросами, модуль может переиспользовать установленные
    подключения к базе данных и устранять необходимость
    <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;обнаружения топологии сервера</a>
    при каждом запросе.
   </p>

   <p class="para">
    Рассмотрим следующий пример:
   </p>

   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$managers </span><span style="color: #007700">= [<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://127.0.0.1'</span><span style="color: #007700">),<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://127.0.0.1'</span><span style="color: #007700">),<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://127.0.0.1:27017'</span><span style="color: #007700">),<br />    new </span><span style="color: #0000BB">MongoDB\Driver\Manager</span><span style="color: #007700">(</span><span style="color: #DD0000">'mongodb://rs1.example.com,rs2.example.com/'</span><span style="color: #007700">, [</span><span style="color: #DD0000">'replicaSet' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'myReplicaSet'</span><span style="color: #007700">]),<br />];<br /><br />foreach (</span><span style="color: #0000BB">$managers </span><span style="color: #007700">as </span><span style="color: #0000BB">$manager</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$manager</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeCommand</span><span style="color: #007700">(</span><span style="color: #DD0000">'test'</span><span style="color: #007700">, new </span><span style="color: #0000BB">MongoDB\Driver\Command</span><span style="color: #007700">([</span><span style="color: #DD0000">'ping' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">]));<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>


   <p class="para">
    Первые два объекта Manager будут использовать один и тот же
    клиент <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a>, поскольку
    их аргументы конструктора идентичны. Третий и четвёртый объекты будут
    использовать каждый свой клиент. Всего будет создано три клиента, и
    процесс PHP, выполняющий этот скрипт, откроет два соединения с
    адресом <code class="literal">127.0.0.1</code> и одно соединение с каждым из
    адресов: <code class="literal">rs1.example.com</code> и <code class="literal">rs2.example.com</code>.
    Если драйвер обнаруживает дополнительных членов набора реплик после выполнения команд
    <code class="literal">hello</code>, он также открывает дополнительные подключения
    к этим серверам.
   </p>

   <p class="para">
    Если этот же процесс снова выполнит сценарий во втором запросе, эти три
    клиента будут использованы повторно, а новых подключений установлено не будет. В зависимости
    от того, как давно был обработан предыдущий запрос, модулю может потребоваться выполнить
    дополнительные команды <code class="literal">hello</code> для обновления своего представления
    топологий.
   </p>
  </div>

  <div class="section">
   <h2 class="title">Сохранение сокетов (версии PHP до 1.2.0)</h2>

   <p class="para">
    Версии модуля до 1.2.0 используют API-интерфейс PHP-потоков
    для подключений к базам данных через внутренний API-интерфейс библиотеки
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a>, чтобы назначить пользовательские
    обработчики для связи с сокетами; однако новый клиент libmongoc
    создаётся для каждого менеджера <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>. В результате
    модуль сохраняет отдельные соединения с базой данных, но не информацию о состоянии аутентификации
    или топологии. Поэтому модулю приходится выдавать
    команды в начале каждого запроса, чтобы проверить подлинность
    и <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;обнаружить топологию сервера</a>.
   </p>

   <p class="para">
    Соединения с базой данных сохраняются как хеш хоста,
    порта и строки URI-идентификатора сервера, которую передавали в конструктор
    менеджера <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>. Параметры массива конструктора
    не включаются в этот хеш.
   </p>

   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     Версии модуля &gt;= 1.1.8 and &lt; 1.2.0 не сохраняют сокеты
     для SSL-соединений. Смотрите
     <a href="https://jira.mongodb.org/browse/PHPC-720" class="link external">&raquo;&nbsp;PHPC-720</a> для получения
     дополнительной информации.
    </span>
   </p></blockquote>

   <p class="para">
    Несмотря на недостатки, которые связаны с сохранением SSL-соединений и информацией о топологии,
    эта версия модуля поддерживает все
    <a href="context.ssl.php" class="link">параметры SSL-контекста</a>, поскольку использует
    API-интерфейс потоков PHP.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>