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 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í 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 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 dříve .

Poslední metodou je použít PHP jako plug-in v multivláknovém web serveru . Aktuálně PHP 4 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 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 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( ) .