cvs: phpdoc-ca /features persistent-connections.xml

[email protected] ("Eduard Capell Brufau") Tue, 30 Aug 2005 05:44:11 -0000
Newsgroups php.doc.ca
Message-ID <cvseduardcapell1125380651@cvsserver>
--eduardcapell1125380651
Content-Type: text/plain

eduardcapell		Tue Aug 30 01:44:11 2005 EDT

  Added files:                 
    /phpdoc-ca/features	persistent-connections.xml 
  Log:
  
  
--eduardcapell1125380651
Content-Type: text/plain
Content-Disposition: attachment; filename="eduardcapell-20050830014411.txt"


http://cvs.php.net/co.php/phpdoc-ca/features/persistent-connections.xml?r=1.1&p=1
Index: phpdoc-ca/features/persistent-connections.xml
+++ phpdoc-ca/features/persistent-connections.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.1 $ -->
<!-- EN-Revision: 1.24 Maintainer: eduardcapell Status: ready -->
 <chapter id="features.persistent-connections">
  <title>Connexions Persistents a Bases de Dades</title>

  <simpara>
   Les connexions persistents són enllaços que no es tanquen quan finalitza
   l'execució d'una seqüència. Quan se sol·licita una connexió persistent, el
   PHP comprova si ja hi ha una connexió persistent idèntica (que ha quedat
   oberta amb anterioritat) - i si existeix, la utilitza. Si no existeix, crea
   l'enllaç. Una connexió 'idèntica' és una connexió que ha estat oberta contra
   la mateix servidor, amb el mateix usuari i la mateixa contrassenya.
  </simpara>
  <simpara>
   Els qui no coneixen bé la manera en què els servidors web funcionen i
   distribueixen la càrrega poden confondre això de les connexions persistents.
   En particular, les connexions persistents <emphasis>no</emphasis> donen la
   possibilitat d'obrir "sessions d'usuari" en el mateix enllaç, tampoc 
   <emphasis>no</emphasis> donen la possibilitat de construir transaccions de
   manera eficient, i no fan moltes d'altres coses. De fet, per tal que quedi
   ben clar, les connexions persistents no us donen <emphasis>cap</emphasis>
   funcionalitat que no fos possible amb els seus germans no-persistents.
  </simpara>
  <simpara>
   Per què?
  </simpara> 
  <simpara>
   Té a veure amb la manera de funcionar dels servidors web. Hi ha tres maneres
   en què el servidor web pot utilitzar el PHP per tal de generar pàgines web.
  </simpara>
  <simpara>
   El primer mètode és el d'utilitzar el PHP com un "embolcall" CGI. Quan
   s'executa així, una instància de l'intèrpret de PHP es crea i destrueix per
   cada petició de pàgines PHP al servidor. 
   Com que es destrueix després de cada petició, qualsevol recurs que pugui
   adquirir (per exemple, enllaços a servidors de bases de dades SQL) també es
   tanquen en el moment de la destrucció. En aquest cas, no es guanya res amb
   l'ús de les connexions persistents -- no persistiran.
  </simpara>
  <simpara>
   El segon mètode, segurament el més popular, és l'execució del PHP com a mòdul
   en un servidor web multiprocés, i això actualment només inclou l'Apache. Un
   servidor multiprocés normalment té un procés (el pare) que coordina un
   conjunt de processos (fills) que són els qui realment serveixen les pàgines
   web. Quan arriba una petició d'un client, aquesta es delega a un procés fill
   que estigui lliure. Això vol dir que quan el mateix client fa una segona
   petició al servidor, aquesta pot ser servida per un procés fill diferent del
   que ha servit la petició anterior. Quan s'obre una connexió persistent, cada
   pàgina subsegüent que sol·liciti serveis SQL pot reutilitzar la mateixa
   connexió establerta amb el servidor SQL.
  </simpara>
  <simpara>
   El darrer mètode és l'ús del PHP com un connector per un servidor web
   multifil. Actualment el PHP 4 dóna suport a ISAPI, WSAPI, i NSAPI (en
   Windows), i tots ells permeten que el PHP s'usi com un connector en servidors
   multifil com ara Netscape FastTrack (iPlanet), Internet Information Server 
   (IIS) de Microsoft, i WebSite Pro d'O'Reilly. El comportament és bàsicament
   el mateix que en el model multiprocés que s'ha descrit abans. Observeu que el
   suport SAPI no està disponible en PHP 3.
  </simpara>
  <simpara>
   Si les connexions persistents no donen funcionalitats addicionals, per a què
   serveixen?
  </simpara>
  <simpara>
   La resposta és ben senzilla -- eficiència. Les connexions persistents són
   útils si el cost de crear un enllaç al servidor SQL és alt. Si aquest cost és
   o no és alt depèn de molts factors. Per exemple, quin tipus de base de dades
   estem tractant, si el servidor és a la mateixa màquina que el servidor web,
   si el servidor de bases de dades està molt o poc carregat, etc. En
   definitiva, si el coste de la connexió és alt, les connexions persistents
   poden ser d'una ajuda considerable. Poden fer que un procés fill només es 
   connection una sola vegada en tota la seva vida, enlloc de connectar-se cada 
   vegada que es processa una pàgina que requereix connexió amb el servidor 
   SQL. Això vol dir que per cada fill que ha obert una connexió persistent
   tindrà la seva pròpia connexió persistent amb el servidor. Per exemple, si
   teniu que 20 processos fills diferents han executat una seqüència que obria
   una connexió persistent a la base de dades, tindreu 20 connexions diferents
   al servidor SQL, una per cada fill.
  </simpara>
  <simpara>
   Observeu, però, que això pot tenir els seus desavantatges, si utilitzeu una
   base de dades amb límits al nombre de connexions que poden ser excedits per
   connexions persistents dels processos fills. Si teniu una base de dades amb
   un límit de 16 connexions simultànies, i en el curs d'una sessió pesada, hi
   ha 17 processos fills que intenten connectar-s'hi, un no podrà fer-ho. Si hi
   ha errors en les vostres seqüències que no permeten que les connexions es
   tanquin mai (bucles infinits, per exemple), la base de dades amb només 16
   connexions disponibles aviat s'esgotarà. Comproveu la documentació del
   servidor de base de dades per conèixer com es gestionen les sessions
   abandonades o inactives.
  </simpara>
  <warning>
   <simpara>
    Hi ha un parell de perills addicionals que cal recordar quan s'utilitzen les
    connexions persistents. Un és el del bloqueig de taules en connexions
    persistents, ja que si la seqüència, per la raó que sigui, no pot alliberar
    el bloqueig, les següents seqüències que utilitzin la mateixa connexió
    es bloquejaran indefinidament i pot ser que calgui reiniciar el servidor web
    o el servidor de base de dades. Un altre perill és el de l'ús de les
    transaccions, ja que el bloqueig d'aquestes també se'l trobaran les següents
    seqüències que utilitzin la connexió. En tots dos casos, és útil la funció 
    <function>register_shutdown_function</function> per tal de registrar una
    funció ben senzilla que faci neteja i desbloquegi les taules o tiri enrere
    les transaccions. Encara millor, eviteu el problema i no utilizeu connexions
    persistents en seqüències que fan servir bloquejos de taules o transaccions,
    penseu que podeu utilitzar connexions persistents en la resta de casos.
   </simpara>
  </warning>
  <simpara>
   Un resum important. Les connexions persistents es van dissenyar per tal de
   tenir una correlació 1 a 1 amb les connexions normals. Això vol dir que 
   <emphasis>sempre</emphasis> hauríeu de poder substituir una connexió
   persistent per una de no persistent, i no canviarà res de la manera en què
   s'executa la vostra seqüència. <emphasis>Podria</emphasis> (i segurament serà
   així) canviar l'eficiència de la seqüència, però no el seu comportament!
  </simpara>
  <para>
   Vegeu també les funcions <function>fbsql_pconnect</function>,
   <function>ibase_pconnect</function>, <function>ifx_pconnect</function>,
   <function>ingres_pconnect</function>,
   <function>msql_pconnect</function>, <function>mssql_pconnect</function>,
   <function>mysql_pconnect</function>, <function>ociplogon</function>,
   <function>odbc_pconnect</function>, <function>ora_plogon</function>,
   <function>pfsockopen</function>, <function>pg_pconnect</function>, i
   <function>sybase_pconnect</function>.
  </para>
 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

--eduardcapell1125380651--