1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
<?xml version="1.0" encoding="iso-8859-2"?>
<!-- EN-Revision: 1.18 Maintainer: goba Status: ready -->
<chapter id="features.persistent-connections">
<title>lland adatbzis kapcsolatok</title>
<simpara>
Az lland kapcsolatok SQL adatbzisokkal nem sznnnek meg,
ha a szkripted futsa befejezdik. Ha egy lland kapcsolatot
krsz, a PHP ellenrzi, hogy van-e mr megegyez kapcsolat (ami
mg az elz krsekbl maradhatott meg), s ha ltezik,
akkor azt hasznlja. Ha nem tall ilyet, ltrehoz egy kapcsolatot.
A megegyez kapcsolat azt jelenti, hogy ugyanaz a host s ugyanaz
a felhasznli nv s jelsz kerlt felhasznlsra.
</simpara>
<note>
<para>
lland kapcsolatokat nem csak adatbzisok szolgltathatnak,
vannak ms ilyen kpessg kiterjesztsek, mint pldul az
<link linkend="ref.imap">IMAP kiterjeszts</link>.
</para>
</note>
<simpara>
Ha esetleg nem ismered alaposabban a webszerverek mkdst,
hibs kp alakulhat ki benned az lland kapcsolatokrl.
Ezek a kapcsolatok <emphasis>nem</emphasis> alkalmasak arra,
hogy felhasznli 'session'-eket nyiss ugyanazon SQL linkkel.
<emphasis>Nem</emphasis> adnak lehetsget hatkony
tranzakcik felptsre. Egszen pontosan, hogy alaposabban
tisztzzuk a krdst, az lland adatbzis kapcsolatok nem
adnak <emphasis>semmilyen</emphasis> plusz lehetsget, ami
nlklk nem ltezne.
</simpara>
<simpara>
Mirt?
</simpara>
<simpara>
A vlaszhoz meg kell rteni, hogyan mkdnek egytt a webszerverek
a PHP-vel. Ennek hrom klnbz mdja lehetsges.
</simpara>
<simpara>
Az els lehetsg, hogy a PHP-t CGI "wrapper"-knt hasznlod.
Ha ezt a mdszert hasznlod, minden oldal lekrsekor s feldolgozsakor
egy j pldny fut le a PHP feldolgozbl. Mivel a szkript
futtatsa utn egy ilyen pldny lell, minden erforrs, amit
lefoglalt (belertve az adatbzis kapcsolatotokat) megsznik.
Ebben az esetben semmit sem rsz azzal, hogy lland kapcsolatot
prblsz nyitni, ez az llandsg nem valsul meg.
</simpara>
<simpara>
A npszerbb msodik forma, amikor a PHP-t modulknt futtatod
egy tbb process-es webszerverben. Egy tbb process-es webszerver
tipikusan rendelkezik egy szl process-el, ami koordinlja a
tbbi kapcsold process (a gyermekek) munkjt, amik valjban
a weboldalak kiszolglst vgzik. Ha egy krs rkezik
egy klienstl, egy ppen szabad gyermekprocess kapja meg a kiszolglsra
az utastst. Ez azt jelenti, hogy ha ugyanaz a kliens egy jabb
kapcsolatot kezdemnyez, esetleg egy msik gyermekprocesshez jut, mint
az els alkalommal. Ebben az esetben az lland adatbzis kapcsolat
azt jelenti a szmodra, hogy az egyes gyermekprocess-ek csak az els
alkalommal kell, hogy ltrehozzk a kapcsolatot az adatbzissal,
s amennyiben egy ksbbi krs ugyanebben a gyermekprocessben
ugyanazt a kapcsoltatot kvnja megnyitni, a ltez kapcsolat
kerl felhasznlsra.
</simpara>
<simpara>
A harmadik mdszer, hogy a PHP-t plug-in-knt hasznlod egy
'multithreaded' web szerverben. Ez azt jelenti, hogy az
ISAPI, WSAPI, s NSAPI (Windows alatt) formk hasznlhatak
a PHP-vel. Ez a PHP 4.0.0 ta lehetsges, s gy a PHP alkalmas
plug-in szint egyttmkdsre a Netscape FastTrack (iPlanet),
a Microsoft Internet Information Server (IIS),
s az O'Reilly WebSite Pro szerverekkel, valamint ms,
a fenti standardokat tmogat szerverekkel. Ebben az esetben
az lland adatbzis kapcsolatok mkdse megegyezik a fent
lert tbb process-es modellel.
</simpara>
<simpara>
Ha az lland adatbzis kapcsolatok nem nyjtanak plusz
szolgltatsokat, mgis mire jk?
</simpara>
<simpara>
A vlasz igen egyszer: hatkonysg! Az lland adatbzis
kapcsolatok akkor lehetnek hasznosak, ha nagy a feleslegesen
adatbzishoz kapcsoldssal eltlttt id. Az, hogy ez valjban
milyen esetben van gy, rengeteg faktoron mlik. Pldul
azon, hogy milyen tpus adatbzisrl van sz, azonos, vagy
klnbz gpen van-e, mint a szerver, mennyire terhelt az
SQL szerver, stb. Lnyegben, ha sok idt vesz ignybe a
kapcsolds, az lland kapcsolatok jelents segtsget
nyjthatnak neked. Egy gyermekprocess gy csak egy alkalommal
kell, hogy kapcsoldjon, ahelyett, hogy egy
ezt kr oldal minden feldolgozsakor megtenn. Ez azt is
jelenti, hogy minden gyermekprocessnek, meglesz a maga
lland kapcsolata a szerver fel. Pldul, ha 20 klnbz
gyermekprocess dolgozott fel egy lland adatbziskapcsolatot
kr oldalt, 20 klnbz lland kapcsolatod lesz az SQL
szerverhez, egy-egy minden gyermektl.
</simpara>
<simpara>
Fontos megjegyezni azonban, hogy ennek lehetnek htrnyos
kvetkezmnyei is, ha az adatbzisszerver korltozott
kapcsolatainak szmt az lland kapcsolatok lefoglaljk.
Ha az adatbzisszervered egyidejleg maximlisan 16 kapcsolatot
kpes kezelni, s egy forgalmas idszakban egyszerre 17
process prbl meg kapcsoldni az adatbzishoz, az egyik
kptelen lesz erre... Ha olyan hiba van a programodban
(pldul vgetelen ciklus), ami nem hagyja a kapcsolat
felbontst, egy csak 32 kapcsolattal br adatbzis
alaposan le lesz foglalva. Nzz utna az adatbzisszervered
dokumentcijban, hogy hogyan tudod lekezelni az
elhagyott vagy inaktv kapcsolatokat.
</simpara>
<warning>
<simpara>
Van mg nhny faktor, amit rdemes figyelembe venned,
ha lland adatbzis kapcsolatokat hasznlsz. Egy ilyen
problma, hogy ha tbla lezrst (lock) hasznlsz egy
lland kapcsolaton, s a szkript valamilyen okbl nem
tudja feloldani a zrat, ezt a kapcsolatot hasznl
tovbbi szkriptek nem fognak helyesen mkdni, s a
webszerver vagy adatbzis szerver jraindtsra lehet
szksg a feloldshoz. Hasonlan ha tranzakcikat hasznlsz,
a tranzakci blokk tovbb folytatdik a kvetkez megegyez
kapcsolatot hasznl szkriptben, ha a tranzakcit indt
szkript nem tudja lezrni azt. Ezekben az esetekben a
<function>register_shutdown_function</function> fggvnyt
hasznlhatod, hogy egy egyszer "takart" fggvnyt futtass
le a programod vgeztvel, ami visszavonja a tranzakcikat,
s feloldja a tbla zrakat. Jobban teszed azonban, ha
gy kerld meg a problmt, hogy nem hasznlsz lland
kapcsolatokat olyan szkriptekben, amik tbla zrakat,
vagy tranzakcikat alkalmaznak.
</simpara>
</warning>
<simpara>
sszefoglalva: az lland adatbziskapcsolatokat gy terveztk,
hogy megfeleltethetek legyenek a hagyomnyos kapcsolatokkal.
Ez azt jelenti, hogy <emphasis>minden esetben</emphasis>
lehetsged van az lland kapcsolatokat hagyomnyos kapcsolatokra
cserlni, s ez nem fogja megvltoztatni a szkriptjeid mkdst.
Ez a lps megvltoztat<emphasis>hat</emphasis>ja a szkripted
hatkonysgt, de a viselkedst nem!
</simpara>
<para>
Lsd mg <function>fbsql_pconnect</function>,
<function>ibase_pconnect</function>, <function>ifx_pconnect</function>,
<function>imap_popen</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>, s
<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
-->
|