Forum und email
Persistentní databázová spojení

Kapitola 41. 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().