Notatka
:
Ten
rozdział
dotyczy
wersji
3.0.7
i
późniejszych
.
PHP
wewnętrznie
zarządza
stanem
połączenia
.
Mogą
wystąpić
trzy
stany
:
Kiedy
skrypt
PHP
się
wykonuje
,
aktywny
jest
stan
NORMAL
.
Jeśli
klient
się
rozłączy
,
stan
przechodzi
w
ABORTED
.
Zwykle
ma
to
miejsce
gdy
użytkownik
naciśnie
przycisk
STOP
w
przeglądarce
.
Jeśli
przekroczony
zostanie
narzucony
limit
czasu
(
patrz
set_time_limit(
)
)
,
stan
zmienia
się
na
TIMEOUT
.
Możesz
zdecydować
czy
po
rozłączeniu
klienta
praca
skryptu
ma
zostać
przerwana
.
Czasem
przydatne
jest
by
skrypty
działały
do
końca
,
nawet
gdy
braknie
przeglądarki
do
której
można
wysyłać
dane
.
Domyślnie
,
po
rozłączeniu
się
klienta
,
działanie
skryptu
jest
przerywane
.
To
zachowanie
można
zmienić
dzięki
opcji
ignore_user_abort
w
php.ini
,
jak
również
dyrektywie
Apache
"
php_value
ignore_user_abort
"
lub
funkcji
ignore_user_abort(
)
.
Jeśli
nie
każesz
PHP
ignorować
rozłączeń
klienta
,
a
klient
rozłączy
się
,
skrypt
zakończy
działanie
.
Jedyny
wyjątek
wystąpi
,
jeśli
zarejestrujesz
funkcję
zamykającą
,
używając
register_shutdown_function(
)
.
Wtedy
,
gdy
użytkownik
wciśnie
przycisk
STOP
i
przy
kolejnej
próbie
wysłania
wyniku
PHP
wykryje
przerwanie
połączenia
,
zostanie
wykonana
funkcja
zamykająca
.
Będzie
ona
również
wywoływana
przy
normalnym
zakończeniu
pracy
skryptu
,
zatem
,
by
wykonać
inne
czynności
gdy
klient
się
rozłączy
,
można
użyć
funkcji
connection_aborted(
)
.
Zwraca
ona
TRUE
jeśli
połączenie
zostało
przerwane
.
Skrypt
może
zostać
również
zakończony
przez
wbudowany
licznik
czasu
.
Domyślnie
czas
ten
wynosi
30
sekund
.
Wartość
tę
można
zmienić
używając
opcji
max_execution_time
w
php.ini
,
jak
również
dyrektywy
Apache
"
php_value
max_execution_time
"
lub
funkcji
set_time_limit(
)
.
Kiedy
czas
na
wykonanie
się
skończy
,
skrypt
zostanie
przerwany
podobnie
jak
w
przypadku
rozłączenia
się
klienta
(
patrz
wyżej
)
.
Jeśli
funkcja
zamykająca
była
zarejestrowana
,
zostanie
wywołana
.
Wewnątrz
funkcji
zamykającej
możesz
sprawdzić
czy
została
ona
wywołana
wskutek
przekroczenia
czasu
.
Do
tego
celu
użyj
funkcji
connection_timeout(
)
,
która
zwróci
TRUE
jeśli
to
przekroczenie
limitu
czasu
spowodowało
wywołanie
funkcji
zamykającej
.
Należy
zwrócić
uwagę
,
że
stany
ABORTED
i
TIMEOUT
mogą
być
aktywne
jednocześnie
.
Jest
to
możliwe
,
jeśli
każesz
PHP
ignorować
rozłączenia
klienta
.
PHP
będzie
brało
pod
uwagę
fakt
,
że
połączenie
z
klientem
mogło
zostać
zerwane
,
ale
skrypt
będzie
pracował
dalej
.
Gdy
minie
czas
przeznaczony
na
wykonanie
skryptu
,
zostanie
on
przerwany
i
uruchomiona
zostanie
funkcja
zamykająca
(
jeśli
była
ustawiona
)
.
W
tym
momencie
funkcje
connection_timeout(
)
i
connection_aborted(
)
będą
zwracały
TRUE
.
Możesz
także
sprawdzić
oba
stany
przy
pomocy
funkcji
connection_status(
)
.
Zwróci
ona
aktywne
stany
ustawione
bitowo
.
Dla
przykładu
,
jeśli
oba
stany
są
aktywne
,
zostanie
zwrócona
liczba
3
.