Kapitola 21. 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).
Poznámka:
Existují i další rozšíření, která vytváří trvalá spojení,
například
Rozšíření IMAP.
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 o tom 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čena 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 server 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 plug-in v multivláknovém web serveru. Aktuálně PHP 4 má tuto podporu pro ISAPI, WSAPI a NSAPI
(na Windows), což umožnuje používat PHP jako plug-in v multivláknových serverech
jako Netscape FastTrack (iPlanet), Microsoft Internet Information Server (IIS),
a O'Reilly's WebSite Pro. Chování je stejné
jako u multiprocesním modelu popsaném dříve. Podpora pro SAPI není dostupná v PHP 3.
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í.
| Varování |
Zde je několik dodatečných námitek, které se usadily v mysli během
používání trvalých spojení. Jedna z nich je, když používáte zamknuté
tabulky při trvalém spojení a skript z jakéhokoli důvodu nemůže
uvolnit zámek, pak následující skript, který používá stejné spojení,
bude nejspíše na trvalo zablokován a možná bude nutné, abyste
pokaždé restartovali http server nebo databázový server.
Dále pak v případě použití transakcí se transakční blok přenese i do
dalšího skriptu používajícího stejné spojení, pokud jeho vykonání
končí dříve než transakční blok. V každém případě můžete použít
register_shutdown_function() k registraci a
jednoduchému vyčištění funkce pro odemknutí tabulek nebo zrušení
běžící transakce (roll back). Nejlépe se problému vyvarujete úplně
nepoužíváním trvalých spojení ve skriptech, ve kterých se zamykají
tabulky nebo používají transakce (můžete je stále používat na
mnohých dalších místech).
|
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í!
Dále také:
fbsql_pconnect(),
ibase_pconnect(), ifx_pconnect(),
imap_popen(), ingres_pconnect(),
msql_pconnect(), mssql_pconnect(),
mysql_pconnect(), OCIPLogon(),
odbc_pconnect(), Ora_pLogon(),
pfsockopen(), pg_pconnect() a
sybase_pconnect().