Rozdział 20 . Obsługa połączeń

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ść 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 aktywne , zostanie zwrócona liczba 3 .