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í
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(
)
.