Kapitola 22. Persistentnφ databßzovß spojenφ

Trvalß spojenφ jsou SQL spojenφ, kterß se nezavφrajφ na konci pr∙b∞hu skriptu. P°i po╛adavku na trvalΘ spojenφ PHP nejd°φve zkontroluje, jestli u╛ neexistuje identickΘ spojenφ (kterΘ z∙stalo otev°eno z d°φv∞j╣ka) - a pokud existuje, pou╛ije ho. Pokud neexistuje, PHP ho otev°e. "IdentickΘ" spojenφ je spojenφ, kterΘ bylo otev°eno se stejn²m serverem, u╛ivatelsk²m jmΘnem a heslem (pokud je zadßte).

LidΘ, kte°φ nejsou d∙kladn∞ obeznßmeni se zp∙sobem, jak²m web servery fungujφ a distribuujφ zßt∞╛ mohou poklßdat trvalß spojenφ za n∞co Φφm nejsou. Zvlß╣t∞ neumo╛≥ujφ otvφrßnφ "u╛ivatelsk²ch sessions" na stejnΘm SQL spojenφ, neumo╛≥ujφ efektivnφ tvorbu transakcφ, a neumo╛≥ujφ spoustu dal╣φch v∞cφ. Dokonce, aby bylo opravdu a d·kladn∞ jasno, vßm trvalß spojenφ nedajφ ╛ßdnou funkcionalitu, kterß by nebyla mo╛nß s jejich netrval²mi prot∞j╣ky.

ProΦ?

To je dßno zp∙sobem, jak²m fungujφ webovΘ servery. Jsou t°i zp∙soby, jak²mi vß╣ web server m∙╛e vyu╛φt PHP ke generovßnφ webov²ch strßnek.

Prvnφ metodou je pou╛φt PHP jako CGI "obal". V tomto re╛imu se vytvß°φ a niΦφ jedna instance PHP interpretru pro ka╛d² po╛adavek (na PHP strnßnku) na va╣em web serveru. Proto╛e je zniΦna po obslou╛enφ po╛adavku, v╣echny zdroje, kterΘ zφskß (jako t°eba spojenφ s databßzov²m serverem) jsou p°i jejφm zniΦenφ zav°eny. V tomto p°φpad∞ pokusem o pou╛itφ trval²ch spojenφ nic nezφskßte - prost∞ nevydr╛φ.

Druhou, a nejpopulßrn∞j╣φ, metodou, je provozovat PHP jako modul v multiprocesnφm web serveru, co╛ je mno╛ina, kterß v souΦasnosti obsahuje pouze Apache. Multiprocesnφ web serveru mß typicky jeden proces (rodiΦe), kter² °φdφ skupinu proces∙ (sv²ch d∞tφ), kterΘ d∞lajφ vlastnφ prßci - servφrujφ strßnky. Ka╛d² po╛adavek, kter² p°ijde od klienta, je obslou╛en jednφm z d∞tφ, kterΘ prßv∞ neobsluhuje jinΘho klienta. To znamenß, ╛e kdy╛ stejn² klient vznese dal╣φ po╛adavek na stejn² server, tento m∙╛e b²t obslou╛en jin²m d∞tsk²m procesem ne╛ ten prvnφ. Trvalß spojenφ zaji╣╗ujφ, aby se ka╛d² d∞tsk² proces musel na vß╣ SQL server p°ihlßsit pouze p°i prvnφm odeslßnφ strßnky, kterß takovΘ spojenφ vyu╛φvß. Kdy╛ spojenφ s SQL serverem vy╛aduje dal╣φ strßnka, m∙╛e pou╛φt spojenφ, kterΘ toto dφt∞ otev°elo u╛ d°φve.

Poslednφ metodou je pou╛φt PHP jako plugin v multithreadovΘm web serveru. To je v souΦasnostφ pouhß teorie - PHP je╣t∞ nefunguje jako plagin v ╛ßdnΘm multithreadovΘm web serveru. Pracuje se na podpo°e ISAPI, WSAPI a NSAPI (na Windows), co╛ umo╛nφ pou╛φvat PHP jako plugin v multithreadov²ch serverech jako Netscape FastTrack, Microsoft Internet Information Server (IIS), a O'Reilly's WebSite Pro. A╛ k tomu dojde, chovßnφ bude v podstat∞ stejnΘ jako u multiprocesnφm modelu popsanΘm d°φve.

Pokud trvalß spojenφ neposkytujφ ╛ßdnou p°idanou funkcionalitu, k Φemu jsou dobrß?

Odpov∞∩ na tuto otßzku je velmi jednoduchß - efektivita. Trvalß spojenφ jsou dobrß, pokud mß tvorba spojenφ s va╣φm SQL serverem vysokou re╛ii. Reßlnß v²╣e tΘto re╛ie zßle╛φ na mnoha faktorech. Nap°φklad jak² je to typ databßze, jestli sφdlφ na stejnΘm poΦφtaΦi jako vß╣ webserver, jak zatφ╛en² je stroj, na kterΘm vß╣ SQL server b∞╛φ a tak dßle. Pointa je, ╛e pokud je spojovacφ re╛ie vysokß, trvalß spojenφ vßm znateln∞ pomohou. Umo╛nφ d∞tskΘmu procesu p°ipojit se pouze jednou za cel² jeho ╛ivotnφ cyklus mφsto ka╛dΘho zpracovßnφ strßnky, kterß vy╛aduje spojenφ s SQL serverem. To znamenß, ╛e ka╛dΘ dφt∞, kterΘ otev°elo trvalΘ spojenφ, bude mφt otev°enΘ vlastnφ trvalΘ spojenφ se serverem. Pokud nap°φklad mßte 20 d∞tsk²ch proces∙, kterΘ spustily skript, kter² otev°el trvalΘ spojenφ s va╣φm SQL serverem, mßte 20 nezßvisl²ch spojenφ s SQL serverem, po jednom z ka╛dΘho dφt∞te.

V╣imn∞te si nicmΘn∞, ╛e to m∙╛e mφt nev²hody, pokud pou╛φvate databßzi s omezen²m poΦtem p°ipojenφ, kter² trvalß spojenφ d∞tφ p°ekroΦφ. Pokud mß va╣e databßze limit 16 souΦasn²ch p°ipojenφ, a v ru╣nΘm okam╛iku se pokusφ p°ipojit 17 d∞tsk²ch proces∙, jednomu se to nepoda°φ. Pokud mßte ve sv²ch skriptech chyby, kterΘ brßnφ zavφrßnφ spojenφ (nap°. nekoneΦnΘ smyΦky), databßze s pouh²mi 32 spojenφmi bude brzy zaplavena. Vyhledejte si v dokumentaci va╣φ databßze informace o obsluze opu╣t∞n²ch nebo neΦinn²ch spojenφ.

D∙le╛it² souhrn. Trvalß spojenφ byla navr╛ena tak, aby odpovφdala jedna k jednΘ normßlnφm spojenφm. To znamenß, ╛e byste v╛dy m∞li b²t schopni nahradit trvalß spojenφ netrval²mi beze zm∞ny fungovßnφ va╣eho skriptu. M∙╛e to (a pravd∞podobn∞ bude) mφt vliv na efektivitu tohoto skriptu, ale ne jeho chovßnφ!