Sophie

Sophie

distrib > Mandriva > 2008.1 > i586 > by-pkgid > 703d980c580707c382b4e43e25965bc5 > files > 63

php-manual-pt_BR-5.2.4-1mdv2008.1.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Conexão Permanente com o Banco de Dados</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="Manual do PHP"
HREF="index.html"><LINK
REL="UP"
TITLE="Características"
HREF="features.html"><LINK
REL="PREVIOUS"
TITLE="Tratamento de Conexões"
HREF="features.connection-handling.html"><LINK
REL="NEXT"
TITLE="Modo Seguro (Safe Mode)"
HREF="features.safe-mode.html"><META
HTTP-EQUIV="Content-type"
CONTENT="text/html; charset=UTF-8"></HEAD
><BODY
CLASS="chapter"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Manual do PHP</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="features.connection-handling.html"
ACCESSKEY="P"
>Anterior</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="features.safe-mode.html"
ACCESSKEY="N"
>Próxima</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="features.persistent-connections"
>Capítulo 41. Conexão Permanente com o Banco de Dados</A
></H1
><P
>&#13;   Conexões persistentes são conexões que não fecham quando a
   execução do seu script termina. Quando uma conexão persistente é
   requisitada, o PHP checa se já existe uma conexão persistente
   idêntica (que foi mantida aberta anteriormente) - e, se ela existe, ele
   a usa. Se não existir, ele cria uma nova. Uma conexão
   'idêntica' é uma conexão que foi aberta ao mesmo host, com o
   mesmo nome de usuário e a mesma senha (onde for aplicável).
  </P
><P
>&#13;   Pessoas que não estão totalmente familiarizadas com a maneira como servidores 
   web trabalham e distribuem a carga podem confundir conexões persistentes com o que
   elas não são. In particular, elas <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>não</I
></SPAN
> dão a
   você a habilidade de abrir 'sessões de usuários' na mesma conexão, elas
   <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>não</I
></SPAN
> dão a habilidade de construir uma
   transação eficientemente, e elas não fazem um monte de outras
   coisas. De fato, para ser extremamente claro sobre o assunto,
   conexões persistentes não te dão <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>nenhuma</I
></SPAN
>
   funcionalidade que não era possível com as suas correspondentes
   não-persistentes.
  </P
><P
>&#13;   Por que?   
  </P
><P
>&#13;   Tem a ver com a maneira como os servidores web funcionam. Existem três maneiras
   de seu servidor web utilizar o PHP para gerar páginas.
  </P
><P
>&#13;   O primeiro método é usar o PHP como um CGI "wrapper". Quando executado dessa
   maneira, uma instância do interpretador do PHP é criada e destruída
   para cada requisição de página (por uma página PHP) para o seu servidor web.
   Como ela é destruída após cada requisição, quaisquer recursos que ela
   adquirir (como uma conexão para um banco de dados) são fechados quando
   ela é destruída. Nesse caso, não há nenhum ganho ao tentar
   usar conexões persistentes -- elas simplesmente não persistem.
  </P
><P
>&#13;   O segundo método, o mais popular, é rodar o PHP como um módulo em um
   servidor com multi-processos, que atualmente só inclue o Apache. Um
   servidor com multi-processos tipicamente tem um processo (pai) que
   coordena uma série de processos (filhos) que são os que realmente fazem
   o trabalho de servir as páginas. Quando uma requisição chega de um
   cliente, ela é entregue à um dos filhos que não estiver ocupado
   servindo outro cliente. Isso significa que quando o mesmo cliente
   faz uma segunda requisição ao servidor, ele pode ser servido por um processo
   filho diferente do da primeira vez. Quando abre-se uma conexão persistente,
   cada página que requisitar serviços de SQL pode reusar a mesma
   conexão estabelecida ao servidor SQL.
  </P
><P
>&#13;   O último método é usar o PHP como um plug-in para um servidor web
   multithreaded. Atualmente, o PHP4 tem suporte para ISAPI, WSAPI, e NSAPI (no
   Windows), todos permitindo PHP ser usado como um plug-in em servidores
   multithreaded como Netscape FastTrack (iPlanet), Internet Information Server 
   (IIS) da Microsoft, e O'Reilly's WebSite Pro. O comportamento é essencialmente
   o mesmo do modelo multiprocessado descrito anteriormente. Perceba que
   suporte a SAPI não está disponível no PHP 3.
  </P
><P
>&#13;   Se conexões persistentes não tem nenhuma funcionalidade a mais, para
   que elas servem?
  </P
><P
>&#13;   A resposta é extremamente simples -- eficiência. Conexôes
   persistentes são boas se o sobrecarga (overhead) de criar uma conexão ao seu 
   servidor SQL for alta. Saber se essa sobrecarga é alta depende de
   vários fatores. Como que tipo de banco de dados é, se está ou não
   na mesma máquina onde o servidor web está, o quão carregada de trabalho 
   está a máquina hospedando o servidor SQL e assim por diante. O
   ponto é que se a sobrecarga de conexão for alta, conexões 
   persistentes ajudam consideravelmente. Elas fazem com que os processos filhos
   simplesmente conectam-se uma vez só durante toda sua duração, ao invés de
   cada vez que eles processam uma página que requer uma conexão ao servidor
   SQL. Isso significa que cada filho que abriu uma conexão
   persistente terá sua própria conexão aberta ao 
   servidor. Por exemplo, se você tiver 20 processos filhos diferentes que
   rodassem um script que fizesse uma conexão persistente à um servidor SQL,
   você teria 20 conexões diferentes ao banco, uma de
   cada filho.
  </P
><P
>&#13;   Perceba, no entanto, que isso pode ter algumas desvantagens se você estiver
   usando um banco com limite de conexões que é excedido pela conexões
   persistentes filhas. Se seu banco tem um limite de 16 conexões
   simultâneas, e durante um momento de pico de acessos, 17 processos
   filhos tentam fazer a conexão, um deles não será capaz. Se houver 
   bugs no seus scripts que não permitem que as conexões se fechem
   (como loops infinitos) o banco de dados com apenas 16 conexões
   pode rapidamente ficar sobrecarregado. Procure na documentação do seu banco
   por informações sobre como lidar com conexões ociosas ou abandonadas.
  </P
><DIV
CLASS="warning"
><P
></P
><TABLE
CLASS="warning"
BORDER="1"
WIDTH="100%"
><TR
><TD
ALIGN="CENTER"
><B
>Atenção</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>&#13;    Existem mais alguns cuidados a se tomar quando usando
    conexões persistentes. Um deles é que, quando usando travamento de
    tabela em uma conexão persistente, se o script por qualquer
    razão não pode destravar a mesma, então scripts subsequentes usando a
    mesma conexão serão bloqueados indefinidamente e pode ser preciso
    reiniciar o servidor http ou o banco de dados. Outro cuidado a se ter é,
    quando usando transações, um bloco de transação também será carregado
    para o próximo script que usar a conexão se a execução do script
    terminar primeiro que o bloco de transação. Em ambos os casos, você pode
    usar <A
HREF="function.register-shutdown-function.html"
><B
CLASS="function"
>register_shutdown_function()</B
></A
> para registrar uma
    função simples de limpeza para destravar suas tabelas e fazer roll back de
    suas transação. O ideal é evitar o problema completamente não usando
    conexões persistentes em scripts que usam travamento de tabelas ou
    transações (você ainda pode usar elas nos outros casos).
   </P
></TD
></TR
></TABLE
></DIV
><P
>&#13;   Um resumo importante. Conexões persistente foram feitas para ter
   um mapeamento de um-para-um com conexões normais. Isso significa que você
   deve <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>sempre</I
></SPAN
> ser capaz de substituir conexões
   persistentes com conexões não-persistentes e isso não mudará
   a maneira como seu script se comporta. <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>Pode</I
></SPAN
> (e
   provavelmente irá) mudar a eficiência do mesmo, mas não o seu
   comportamento!
  </P
><P
>&#13;   Veja também <A
HREF="function.fbsql-pconnect.html"
><B
CLASS="function"
>fbsql_pconnect()</B
></A
>,
   <A
HREF="function.ibase-pconnect.html"
><B
CLASS="function"
>ibase_pconnect()</B
></A
>, <A
HREF="function.ifx-pconnect.html"
><B
CLASS="function"
>ifx_pconnect()</B
></A
>,
   <A
HREF="function.ingres-pconnect.html"
><B
CLASS="function"
>ingres_pconnect()</B
></A
>,
   <A
HREF="function.msql-pconnect.html"
><B
CLASS="function"
>msql_pconnect()</B
></A
>, <A
HREF="function.mssql-pconnect.html"
><B
CLASS="function"
>mssql_pconnect()</B
></A
>,
   <A
HREF="function.mysql-pconnect.html"
><B
CLASS="function"
>mysql_pconnect()</B
></A
>, <A
HREF="function.ociplogon.html"
><B
CLASS="function"
>ociplogon()</B
></A
>,
   <A
HREF="function.odbc-pconnect.html"
><B
CLASS="function"
>odbc_pconnect()</B
></A
>, <A
HREF="function.ora-plogon.html"
><B
CLASS="function"
>ora_plogon()</B
></A
>,
   <A
HREF="function.pfsockopen.html"
><B
CLASS="function"
>pfsockopen()</B
></A
>, <A
HREF="function.pg-pconnect.html"
><B
CLASS="function"
>pg_pconnect()</B
></A
>, e
   <A
HREF="function.sybase-pconnect.html"
><B
CLASS="function"
>sybase_pconnect()</B
></A
>.
  </P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="features.connection-handling.html"
ACCESSKEY="P"
>Anterior</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Principal</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="features.safe-mode.html"
ACCESSKEY="N"
>Próxima</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Tratamento de Conexões</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="features.html"
ACCESSKEY="U"
>Acima</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Modo Seguro (Safe Mode)</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>