<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.oci8.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'oci8.connection.php',
    1 => 'Manipula&ccedil;&atilde;o e conjunto de conex&otilde;es do OCI8',
    2 => 'Manipula&ccedil;&atilde;o e conjunto de conex&otilde;es do OCI8',
  ),
  'up' => 
  array (
    0 => 'book.oci8.php',
    1 => 'OCI8',
  ),
  'prev' => 
  array (
    0 => 'oci8.examples.php',
    1 => 'Exemplos',
  ),
  'next' => 
  array (
    0 => 'oci8.fan.php',
    1 => 'Suporte &agrave; Notifica&ccedil;&atilde;o R&aacute;pida de Aplica&ccedil;&atilde;o (FAN) do OCI8',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/oci8/connection.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="oci8.connection" class="chapter">
 <h1 class="title">Manipulação e conjunto de conexões do OCI8</h1>

 <div class="section">
  <h2 class="title">Funções de conexão</h2>
  <p class="para">
   A extensão OCI8 fornece três funções diferentes para
   conexão com o Oracle. A função de conexão padrão
   é <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>. Ela cria uma conexão a
   um banco de dados Oracle e retorna um recurso usado pelas chamadas
   subsequentes ao banco de dados.
  </p>
  <p class="para">
   Conectar-se a um servidor Oracle é uma operação razoavelmente custosa
   em termos de tempo que leva para ser concluída.
   A função <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> usa um cache persistente
   de conexões que pode ser reutilizado em diferentes solicitações
   de script. Isso significa que a sobrecarga de conexão normalmente
   ocorrerá apenas uma vez por processo PHP (ou processo filho do Apache).
  </p>
  <p class="para">
   Se a aplicação se conectar ao Oracle usando um conjunto diferente de credenciais de
   banco de dados para cada usuário da web, o cache persistente empregado por
   <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> se tornará menos útil à medida que o
   número de usuários simultâneos aumentar, a ponto de poder
   começar a afetar adversamente o desempenho geral do servidor Oracle
   devido à manutenção de muitas conexões inativas. Se a
   aplicação estiver estruturada desta forma, é recomendado
   ajustá-lo usando as configurações
   <a href="oci8.configuration.php#ini.oci8.max-persistent" class="link">oci8.max_persistent</a>
   e <a href="oci8.configuration.php#ini.oci8.persistent-timeout" class="link">oci8.persistent_timeout</a>
   (elas darão controle sobre o tamanho e o tempo de vida do
   cache de conexão persistente), ou usar o Oracle Database
   Resident Connection Pooling (no Oracle Database 11g ou posterior) ou usar
   <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> em vez disso.
  </p>
  <p class="para">
   Tanto <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> quanto
   <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> empregam um cache de conexão; se
   múltiplas chamadas a
   <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> usarem os mesmos parâmetros em um determinado
   script, a segunda chamada e as subsequentes retornarão o identificador
   de conexão existente. O cache usado
   por <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> é limpo no final da
   execução do script ou quando o identificador de conexão é explicitamente fechado. A
   função <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> tem comportamento semelhante,
   embora seu cache seja mantido separadamente e sobreviva entre
   requisições HTTP.
  </p>
  <p class="para">
   Esse recurso de cache significa que os dois identificadores não são isolados
   transacionalmente (eles são, na verdade, o mesmo identificador de conexão, portanto
   não há nenhum tipo de isolamento). Se o aplicativo precisar de duas conexões separadas
   e isoladas transacionalmente,
   use <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span>.
  </p>
  <p class="para">
   O cache <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> é limpo e quaisquer
   conexões de banco de dados são fechadas quando o processo PHP termina, portanto,
   o uso eficaz de conexões persistentes requer que o PHP seja um
   módulo Apache ou usado com FPM, ou similar. Conexões persistentes
   não terão nenhum benefício sobre <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
   quando o PHP for usado com CGI ou através da linha de comando.
  </p>
  <p class="para">
   A função <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span> sempre cria uma
   nova conexão com o servidor Oracle, independentemente de outras
   conexões que já possam existir. Aplicações web de alto tráfego
   devem evitar o uso de
   <span class="function"><a href="function.oci-new-connect.php" class="function">oci_new_connect()</a></span>, especialmente nas seções mais movimentadas
   da aplicação.
  </p>
  <p class="para">
   Conexões persistentes podem ser
   fechadas pelo usuário, permitindo maior controle sobre o uso dos
   recursos da conexão. Conexões persistentes agora também serão fechadas
   automaticamente quando não houver nenhuma variável PHP fazendo referência a elas, como
   no final do escopo de uma função de usuário PHP. Isso reverterá
   qualquer transação não confirmada. Essas alterações nas conexões
   persistentes fazem com que elas se comportem de maneira semelhante às conexões
   não persistentes, simplificando a interface, permitindo maior
   consistência e previsibilidade da aplicação.
   Use <a href="oci8.configuration.php#ini.oci8.old-oci-close-semantics" class="link">oci8.old_oci_close_semantics</a>
   definido como
   <em>On</em> para manter o comportamento histórico.
  </p>
  <p class="para">
   O restabelecimento automático de conexões persistentes PHP após o reaparecimento
   de um processo Apache ou FPM significa que os gatilhos <code class="literal">LOGON</code>
   do Oracle Database são recomendados apenas para definir atributos de sessão e não para
   solicitações de conexão de usuário por aplicação.
  </p>
 </div>
 <div class="section">
  <h2 class="title">Conjunto de conexões DRCP</h2>
  <p class="para">
   O PHP suporta Oracle Database Resident
   Connection Pooling (DRCP). O DRCP permite um uso mais eficiente da
   memória da máquina de banco de dados e oferece alta escalabilidade. Nenhuma, ou apenas
   uma mínima, alteração na aplicação é necessária para usar o DRCP.
  </p>
  <p class="para">
   O DRCP é adequado para aplicações que se conectam usando poucos esquemas de
   banco de dados e mantêm conexões de abertas por um curto período de
   tempo. Outras aplicações devem usar os processos de servidor
   de banco de dados <code class="literal">Dedicated</code> (dedicados) padrão da Oracle ou
   usar servidores <code class="literal">Shared</code> (compartilhados).
  </p>
  <p class="para">
   O DRCP beneficia todas as três funções de conexão, mas oferece a maior
   escalabilidade quando as conexões são criadas
   com <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span>.
  </p>
  <p class="para">
   Para que o DRCP esteja disponível no OCI8, as bibliotecas cliente Oracle usadas pelo
   PHP e a versão do banco de dados Oracle devem ser 11g ou superior.
  </p>
  <p class="para">
   A documentação sobre DRCP é encontrada em vários manuais da Oracle. Por
   exemplo,
   consulte <a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/jjdbc/database-resident-connection-pooling.html" class="link external">&raquo;&nbsp;Configuring
   Database Resident Connection Pooling</a> (em inglês) na documentação do
   Oracle para obter informações de uso.
   Um <a href="https://www.oracle.com/technetwork/topics/php/whatsnew/php-scalability-ha-twp-128842.pdf" class="link external">&raquo;&nbsp;artigo
   técnico do DRCP</a> (em inglês) contém informações básicas sobre o DRCP.
  </p>
  <p class="para">
   Para usar o DRCP, instale a extensão OCI8 e as bibliotecas Oracle 11g (ou posterior)
   e siga estas etapas:
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      Como administrador de banco de dados privilegiado, use um programa como
      o SQL*Plus para iniciar o conjunto de conexões no banco de dados:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    SQL&gt; execute dbms_connection_pool.start_pool;
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Opcionalmente,
      use <code class="literal">dbms_connection_pool.alter_param()</code> para
      definir as configurações de DRCP. As configurações atuais do conjunto podem ser
      consultadas na visualização <code class="literal">DBA_CPOOL_INFO</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Atualize as cadeias de conexão usadas. Para aplicativos PHP que
      atualmente se conectam usando um nome de conexão de rede
      como <code class="literal">MYDB</code>:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    $c = oci_pconnect(&quot;meu_usuario&quot;, &quot;minha_senha&quot;, &quot;MYDB&quot;);
</pre></div>
       </div>
      </div>
     </p>
     <p class="para">
      modifique o arquivo tnsnames.ora e adicione
      uma cláusula <code class="literal">(SERVER=POOLED)</code>, por exemplo:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=meuhost.dom.com)
           (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=vendas)
           (SERVER=POOLED)))
</pre></div>
       </div>
      </div>
     </p>
     <p class="para">
      Alternativamente, modifique a sintaxe do Easy Connect no PHP e adicione
      <code class="literal">:POOLED</code> após o nome do serviço:
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    $c = oci_pconnect(&quot;meu_usuario&quot;, &quot;minha_senha&quot;, &quot;meuhost.dom.com:1521/vendas:POOLED&quot;);
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Edite o <var class="filename">php.ini</var> e escolha um nome de classe de conexão. Este nome
      indica uma divisão lógica do conjunto de conexões e pode ser
      usado para isolar o conjunto para aplicações separadas. Quaisquer aplicações
      PHP com o mesmo nome de usuário e valor de classe de conexão
      poderão compartilhar conexões no conjunto, proporcionando maior
      escalabilidade.
     </p>
     <p class="para">
      <div class="informalexample">
       <div class="example-contents screen">
<div class="cdata"><pre>
    oci8.connection_class = &quot;MY_APPLICATION_NAME&quot;
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Execute a aplicação, conectando-se ao banco de dados 11g (ou posterior).
     </p>
    </li>
    </ul>
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Aplicações que usam bibliotecas Oracle Client 10g que exigem o desempenho de
    conexões persistentes podem reduzir a quantidade de memória do servidor de banco de dados
    necessária usando servidores Oracle <code class="literal">Shared</code>
    (anteriormente conhecidos como Multi Threaded Servers). Consulte a documentação
    da Oracle para obter informações.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    A alteração de senha em conexões DRCP falhará com o erro
    <em>ORA-56609: Usage not supported with DRCP</em> (uso não suportado com DRCP).
    Esta é uma restrição documentada do Oracle Database 11g.
   </p>
  </p></blockquote>
 </div>
</div>
<?php manual_footer($setup); ?>