Kapitola 20. Obsluha spojení
Poznámka: Následující text platí pro verzi 3.0.7 a vyšší.
Stav spojení se v PHP interně sleduje. Jsou tři možné stavy:
Při normálním běhu PHP skriptu je aktivní stav NORMAL. Pokud se klient
odpojí, nastaví se příznak ABORTED. K odpojení vzdáleného klienta typicky
dochází, když uživatel zmáčkne tlačítko STOP. Pokud se dosáhne časového
limitu (viz set_time_limit()), nastaví se stavový příznak
TIMEOUT.
Můžete se rozhodnout jestli chcete, aby odpojení klienta způsobilo předčasné
ukončení vašeho skriptu. Někdy je užitečné nechat skripty doběhnout do konce,
přestože není vzdáleného browseru, který by přijímal výstup. Výchozí chování
je nicméně takové, že při odpojení vzdáleného klienta dojde k ukončení běhu
skriptu. Toto chování se dá změnit skrze konfigurační direktivu
ignore_user_abort v php3.ini, odpovídající direktivu php3_ignore_user_abort
v .conf souboru Apache, či funkci ignore_user_abort().
Pokud nedáte PHP pokyn ignorovat odpojení uživatele a ten se odpojí, váš
skript se ukončí. Výjimkou je, pokud máte pomocí
register_shutdown_function() zaregistrovanou funkci pro
provedení při ukončení skriptu. V tom případě, pokud vzdálený uživatel zmáčkne
tlačítko STOP, při dalším pokusu tohoto skriptu odeslat výstup PHP detekuje,
že spojení bylo zrušeno, a zavolá se funkce zaregistrovaná pro provedení při
ukončení skriptu. Tato funkce se zavolá také na konci běhu skriptu končícím
normálně, takže pokud chcete po zrušeném spojení udělat něco jiného, můžete
použít connection_aborted(). Tato funkce vrátí
TRUE, pokud bylo spojení zrušeno.
Váš skript může také ukončit vestavěný čítač času. Výchozí časový limit je
30 sekund. To se dá změnit max_execution_time direktivou v phpš.ini nebo
odpovídající php3_max_execution_time direktivou v .conf souboru Apahe, či
voláním funkce set_time_limit(). Když čítač času doběhne,
skript se ukončí, a jako ve výše uvedeném případě uživatelského odpojení,
pokud je zaregistrovaná funkce pro provedení při ukončení skriptu, tato se
zavolá. Uvnitř této funkce můžte zkontrolovat, jestli její zavolání způsobilo
doběhnutí čítače času zavoláním funkce connection_timeout().
Tato funkce vrátí TRUE, pokud volání funkce registrované
pro provedení při ukončení skriptu způsobilo doběhnutí čítače času.
Skutečností hodnou povšimnutí je, že stavy ABORTED a TIMEOUT mohou být
aktivní současně. Možné je to v případě, že nařídíte PHP ignorovat odpojení
uživatee. PHP i tak bude vědět, že uživatel přerušil spojení, ale skript
poběží dál. Pokud potom dosáhne časového limitu, bude ukončen, a zavolá se
vaše funkce pro provedení při ukončení skriptu, pokud existuje. V tomto
okamžiku zjistíte, že jak connection_timeout(), tak
connection_aborted() vracejí TRUE.
Oba stavy můžete zkontrolovat jediným voláním funkce
connection_status(). Tato funkce vrací bitové pole
aktivních stavů. Takže například, pokud jsou aktivní oba tyto stavy, vrátí
3.