<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'mongodb.connection-handling.php',
    1 => 'Conex&otilde;es',
    2 => 'Manipula&ccedil;&atilde;o de conex&atilde;o e persist&ecirc;ncia',
  ),
  'up' => 
  array (
    0 => 'mongodb.architecture.php',
    1 => 'Arquitetura do driver e componentes internos',
  ),
  'prev' => 
  array (
    0 => 'mongodb.overview.php',
    1 => 'Arquitetura',
  ),
  'next' => 
  array (
    0 => 'mongodb.persistence.php',
    1 => 'Dados Persistentes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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">Manipulação de conexão e persistência</h2>

  
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Em plataformas Unix, a extensão é sensível a scripts que usam a
     chamada de sistema fork() sem chamar também exec(). Os usuários são aconselhados a não
     reusar instâncias de <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span> em um
     processo filho bifurcado.
    </span>
   </p></blockquote>


  <div class="section">
   <h2 class="title">Persistência de conexão e topologia (versão PHP desde 1.2.0)</h2>

   <p class="para">
    Todas as versões da extensão desde 1.2.0 persistem o
    objeto cliente <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> no
    processo de trabalho do PHP, o que permite reutilizar conexões de banco de dados,
    autenticação de estados, <em>e</em> informações de topologia em
    diversas solicitações.
   </p>

   <p class="para">
    Quando <span class="methodname"><a href="mongodb-driver-manager.construct.php" class="methodname">MongoDB\Driver\Manager::__construct()</a></span> é
    invocado, um hash é criado a partir de seus argumentos (ou seja, string URI e
    opções de array). A extensão tentará encontrar um objeto cliente
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> anteriormente persistente para
    esse hash. Se um cliente existente não puder ser encontrado para o hash, um novo cliente
    será criado e persistido para uso futuro. Este comportamento pode ser desabilitado
    através da opção do driver <code class="literal">&quot;disableClientPersistence&quot;</code>.
   </p>

   <p class="para">
    Cada cliente contém suas próprias conexões de banco de dados e uma visão da topologia do servidor
    (por exemplo, standalone, replica set, shard cluster). Ao persistir o
    cliente entre solicitações PHP, a extensão é capaz de reutilizar conexões de banco
    de dados estabelecidas e eliminar a necessidade de
    <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;descobrir a topologia do servidor</a>
    em cada solicitação.
   </p>

   <p class="para">
    Considere o seguinte exemplo:
   </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">
    Os dois primeiros objetos Manager compartilharão o mesmo
    cliente <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a>, pois
    seus argumentos construtores são idênticos. O terceiro e o quarto objetos usarão
    cada um seu próprio cliente. No total, três clientes serão criados e o
    worker PHP que executa este script abrirá duas conexões para
    <code class="literal">127.0.0.1</code> e uma conexão para cada um de
    <code class="literal">rs1.example.com</code> e <code class="literal">rs2.example.com</code>.
    Se a extensão descobrir membros adicionais do conjunto de réplicas após
    emitir comandos <code class="literal">hello</code>, ela também abrirá conexões adicionais
    com esses servidores.
   </p>

   <p class="para">
    Se o mesmo worker executar o script novamente em uma segunda solicitação, os três
    clientes serão reutilizados e nenhuma nova conexão será feita. Dependendo de há
    quanto tempo a solicitação anterior foi atendida, a extensão pode precisar
    emitir comandos <code class="literal">hello</code> adicionais para atualizar sua visualização das
    topologias.
   </p>
  </div>

  <div class="section">
   <h2 class="title">Persistência de socket (versões PHP anteriores a 1.2.0)</h2>

   <p class="para">
    Versões da extensão anteriores a 1.2.0 utilizam a API de Fluxos do PHP para
    conexões de banco de dados, usando uma API dentro de
    <a href="https://github.com/mongodb/mongo-c-driver" class="link external">&raquo;&nbsp;libmongoc</a> para designar
    manipuladores personalizados para comunicação de socket; entretanto, um novo cliente libmongoc é
    criado para cada <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>. Como resultado,
    a extensão persiste em conexões de banco de dados individuais, mas não no
    estado de autenticação ou nas informações de topologia. Isso significa que a extensão
    precisa emitir comandos no início de cada solicitação para autenticar e
    <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;descobrir a topologia do servidor</a>.
   </p>

   <p class="para">
    As conexões de banco de dados são persistidas por um hash derivado do host do
    servidor, da porta e da string URI usada para construir o
    <span class="classname"><a href="class.mongodb-driver-manager.php" class="classname">MongoDB\Driver\Manager</a></span>. As opções de array do construtor n
    ão estão incluídas neste hash.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Versões da extensão &gt;= 1.1.8 e &lt; 1.2.0 não persiste sockets
     para conexões SSL. Consulte
     <a href="https://jira.mongodb.org/browse/PHPC-720" class="link external">&raquo;&nbsp;PHPC-720</a> para
     obter informações adicionais.
    </span>
   </p></blockquote>

   <p class="para">
    Apesar de suas deficiências com conexões SSL persistentes e informações de
    topologia, esta versão da extensão suporta todas as
    <a href="context.ssl.php" class="link">opções de contexto SSL</a>, uma vez que usa a
    API de Fluxos do PHP.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>