V tomto článku bych se rád zabýval relacemi (session) a jejich využitím v PHP. Článek který právě čtete bude orientován výlučné na teoretické pozadí problematiky, praktickou ukázkou s napojení na MySQL databázi se budeme zabývat v druhém článku.

Session neboli relace umožňuje přesnou identifikaci uživatele a pohyb na serveru. Za pomoci session jsou naprogramovány všechny web-based mailové servery. Má tedy použití všude tam, kde je zapotřebí monitorovat nebo ověřovat uživatele, například pomocí jeho IP adresy. Používá se také pro možnost vlastní úpravy vzhledu (customizing) například na vyhledávacích nebo katalogizačních serverech, kdy po vstupu na stránku server ověří vaši identitu a zobrazí informace, novinky nebo zprávy přesně podle vašeho dřívějšího nastavení. Nutno podotknout, že session jsou implementovány do PHP až od verze 4.0.

Session pracuje na jednoduchém principu. Každý uživatel, který vstoupí na stránku obdrží jednoznačné číslo, budeme ho nazývat ID, resp. SID (Session ID). Často to nebývá pouze číslo, ale vyskytují se v něm i znaky, např. a3c54cd96d712021d54587d5a4b4c. Tímto číslem se tedy bude uživatel identifikovat, tz. ve všech odkazech je zapotřebí předávat tento parametr. PHP implicitně předává SID v proměnné PHPSESSID. Viz. sekce [Session] a položka session.name v souboru php.ini. Ukládání čísla relace v URL je jeden ze způsobů, PHP nabízí kromě toho také ukládání do cookie. Já osobně preferuji raději URL, neboť ne každý uživatel má zapnutou volbu cookie ve svém prohlížeči. Session demostruje svou sílu především možností předávání de facto neomezeného počtu proměnných. Na stránkách tedy nemusíme používat tagy typu:

<input type=“hidden“ name=“promenna“ value=“hodnota“>

Veškerý parametr, který je předáván je pouze SID. Pokud uživatel navštíví stránku, kde používáte session, PHP automaticky (v případě, že je nastavena v souboru php.ini položka session.auto_start =1) otestuje existenci relace. Pokud neexistuje jsou všechny proměnné a relace vytvořeny. Toto lze provést také programově pomocí funkce:

session_start()

Nebo také pomocí funkce:

session_register()

Proměnné mohou být ukládány jako záznamy ve globálním sdruženém poli $HTTP_STATE_VARS nebo jako globální proměnné. Ukládání závisí na nastavení parametrů track_vars a gpc_globals (viz php.ini). Pokud je povolený parametr track_vars, jsou proměnné ukládány v poli $HTTP_STATE_VARS, volba gpc_globals naproti tomu nastavuje ukládání do globálních proměnných. Implicitně jsou oba konfigurační parametry nastavené na On.

Nyní se dostáváme k problému, jak ukládat aktivní relace na serveru. PHP nabízí dvě možnosti, jednak ukládání dat do textového souboru (položka session.save_handler = files v souboru php.ini), nebo do vlastní databáze. Druhým způsobem se budeme podrobněji zabývat v příštím článku. Ukládání do textového souboru je mnohem jednodušší, nicméně, ne příliš transparentní. Pokud se pro něj rozhodneme, musíme v souboru php.ini nastavit cestu k adresáři (session.save_path), kde se budou uchovávat tyto souboru, implicitně je nastaven adresář /tmp. Cestu lze samozřejmě kdykoliv změnit pomocí funkce session_save_path.

Každá relace má svou životnost. Relace končí, pokud uživatel opustí korektně stránku (například se odhlásí), nebo vyprší její časový limit. Je zřejmé, že na serveru musí běžet demon, který kontroluje aktivní relace a maže již neaktivní. Relace, které nejsou již aktivní se nazývají garbage (smetí). v

Nastavení časového limitu, způsobu tvorby, zápisu, čtení a mazání relaci se provádí pomocí této funkce:

session_set_save_handler (open, close, read, write, destroy, gc)

Procedury open, close, read, write, destroy a gc (garbade collection) jsou definované funkce pro práci s relacemi. Jak již bylo řečeno, relace se inicializuje funkcí session_start(). Ukončení relace se provádí funkcí session_destroy() .

To by bylo k teoretickému pozadí session v PHP vše o a příště se budeme zabývat již praktickými kroky.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět