Persistenta databaskopplingar

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Varaktiga databasanslutningar

Varaktiga anslutningar är länkar som inte stängs när exekveringen av ditt skript avslutas. När en varaktig anslutning efterfrågas kontrollerar PHP om det redan finns en identisk varaktig anslutning (som förblev öppen från tidigare) - och om den finns, används den. Om den inte finns skapas länken. En 'identisk' anslutning är en anslutning som öppnades till samma värd, med samma användarnamn och samma lösenord (där det är tillämpligt).

Personer som inte är helt bekanta med hur webbservrar fungerar och distribuerar belastningen kan missförstå varaktiga anslutningar för vad de inte är. Specifikt ger de inte möjligheten att öppna 'användarsessioner' på samma länk, de ger inte möjligheten att effektivt bygga upp en transaktion, och de gör inte en hel del andra saker. Faktum är, för att vara extremt tydlig om ämnet, ger varaktiga anslutningar dig ingen funktionalitet som inte var möjlig med deras icke-varaktiga bröder.

Varför?

Detta har att göra med hur webbservrar fungerar. Det finns tre sätt på vilka din webbserver kan använda PHP för att generera webbsidor.

Den första metoden är att använda PHP som en CGI "wrapper". När det körs på detta sätt skapas och förstörs en instans av PHP-tolken för varje sidförfrågan (för en PHP-sida) till din webbserver. Eftersom den förstörs efter varje förfrågan, stängs alla resurser som den förvärvar (till exempel en länk till en SQL-databasserver) när den förstörs. I detta fall vinner du ingenting på att försöka använda varaktiga anslutningar – de består helt enkelt inte.

Den andra, och mest populära, metoden är att köra PHP som en modul i en multiprocess-webbserver, vilket för närvarande bara inkluderar Apache. En multiprocess-server har vanligtvis en process (föräldern) som koordinerar ett antal processer (dess barn) som faktiskt gör jobbet med att servera webbsidor. När en förfrågan kommer in från en klient, skickas den till ett av barnen som inte redan betjänar en annan klient. Detta innebär att när samma klient gör en andra förfrågan till servern kan det hända att den betjänas av en annan barnprocess än första gången. När en varaktig anslutning öppnas kan varje efterföljande sida som efterfrågar SQL-tjänster återanvända samma etablerade anslutning till SQL-servern.

Den sista metoden är att använda PHP som ett insticksprogram för en multitrådad webbserver. För närvarande har PHP stöd för WSAPI och NSAPI (på Windows), som alla tillåter PHP att användas som ett insticksprogram på multitrådade servrar som Netscape FastTrack (iPlanet), Microsofts Internet Information Server (IIS) och O'Reilly's WebSite Pro. Beteendet är i huvudsak detsamma som för multiprocessmodellen som beskrivs ovan.

Om varaktiga anslutningar inte har någon tillagd funktionalitet, vad är de bra för?

Svaret här är extremt enkelt – effektivitet. Varaktiga anslutningar är bra om overhead för att skapa en länk till din SQL-server är hög. Om denna overhead verkligen är hög beror på många faktorer. Till exempel, vilken typ av databas det är, om den sitter på samma dator som din webbserver sitter på, hur belastad maskinen där SQL-servern sitter är och så vidare. Summan av kardemumman är att om den där anslutningsoverhead är hög, hjälper varaktiga anslutningar dig avsevärt. De får barnprocessen att endast ansluta en gång under hela sin livstid, istället för varje gång den bearbetar en sida som kräver anslutning till SQL-servern. Detta innebär att för varje barn som öppnade en varaktig anslutning kommer att ha sin egen öppna varaktiga anslutning till servern. Till exempel, om du hade 20 olika barnprocesser som körde ett skript som gjorde en varaktig anslutning till din SQL-server, skulle du ha 20 olika anslutningar till SQL-servern, en från varje barn.

Notera dock att detta kan ha vissa nackdelar om du använder en databas med anslutningsgränser som överskrids av varaktiga barnanslutningar. Om din databas har en gräns på 16 samtidiga anslutningar, och under en hektisk server-session försöker 17 barntrådar ansluta, kommer en inte att kunna göra det. Om det finns buggar i dina skript som inte tillåter att anslutningarna stängs ned (som oändliga loopar), kan databasen med endast 16 anslutningar snabbt bli överväldigad. Kontrollera din databas-dokumentation för information om hantering av övergivna eller inaktiva anslutningar.

Varning

Det finns ett par ytterligare varningar att ha i åtanke när du använder varaktiga anslutningar. En är att när du använder tabellåsning på en varaktig anslutning, om skriptet av någon anledning inte kan frigöra låset, kommer efterföljande skript som använder samma anslutning att blockeras oändligt och kan kräva att du antingen startar om httpd-servern eller databasservern. En annan är att när du använder transaktioner, kommer en transaktionsblock också att överföras till nästa skript som använder den anslutningen om skriptexekveringen slutar innan transaktionsblocket gör det. I båda fallen kan du använda register_shutdown_function() för att registrera en enkel rengöringsfunktion för att låsa upp dina tabeller eller rulla tillbaka dina transaktioner. Ännu bättre, undvik problemet helt och hållet genom att inte använda varaktiga anslutningar i skript som använder tabellås eller transaktioner (du kan fortfarande använda dem på andra ställen).

En viktig sammanfattning. Varaktiga anslutningar designades för att ha en-till-en-kartläggning till vanliga anslutningar. Det betyder att du alltid bör kunna ersätta varaktiga anslutningar med icke-varaktiga anslutningar, och det kommer inte att ändra hur ditt skript beter sig. Det kan (och kommer troligen) att ändra effektiviteten i skriptet, men inte dess beteende!

Se även ibase_pconnect(), ociplogon(), odbc_pconnect(), oci_pconnect(), pfsockopen() och pg_pconnect().


Sidslut

Orginalhemsidan på Engelska :https://www.php.net/manual/en/features.persistent-connections.php

PHP

Funktioner


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp.se som har sponsrat Linux.se med webserver.