XC. Sesje

Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych w trakcie następujących po sobie wywołań strony. Pozwala to na budowanie bardziej spersonalizowanych aplikacji i zwiększenie atrakcyjności twojej strony internetowej.

Jeśli jesteś zaznajomiony z zarządzaniem sesją w PHPLIB, zauważysz że pewnie koncepcje są podobne w obłudze sesji PHP.

Gość wchodzący na twoją stronę WWW otrzymuje unikalny identyfikator, tzw. id sesji. Jest ono przechowywane albo jako ciasteczko po stronie użytkownika lub propagowane w URL'u.

Obsługa sesji pozwala ci na rejestrowanie dowolnej ilości zmiennych, które mają być przekazywane pomiędzy stronami. Kiedy gość wchodzi na twoją strone, PHP automatycznie sprawdzi (jeśli session.auto_start jest ustawione na 1) lub na twoje życzenie (jawnie przez wywołanie session_start() lub niejawnie przez wywołanie session_register()) czy specyficzne id sesji zostało przypisane. Jeśli tak, poprzednio zachowane środowisko jest odtwarzane.

Wszystkie zarejestrowane zmienne są serializowane po wykonaniu całego kodu strony. Zarejestrowane zmienne, które są niezdefiniowane, są zaznaczane jako niezdefijiowane. Nie są one definiowane przez moduł sesji w następujących po sobie wywołaniach, chyba że użytkownik zdefiniuje je później.

Opcje konfiguracyjne track_vars i register_globals wpływają na to, jak zmienne sesyjne są przechowywane i odtwarzane.

Notatka: Od PHP w wersji 4.0.3 opcja track_vars jest zawsze włączona.

Jeśli włączona jest opcja track_vars a register_globals jest wyłączona, tylko pozycje należące do zmiennej asocjacyjnej $HTTP_SESSION_VARS mogą być zarejestrowane jako zmienne sesyjne. Odtworzone zmienne sesyjne będą dostępne tylko w zmiennej $HTTP_SESSION_VARS.

Przykład 1. Rejestracja zmiennej z włączoną opcją track_vars

<?php
session_register("count");
$HTTP_SESSION_VARS["count"]++;
?>

Jeśli włączona jest opcja register_globals, wszystkie globalne zmienne mogą być zarejestrowane jako zmienne sesyjne a zmienne sesyjne będą odtworzone do odpowiadających im zmiennych globalnych.

Przykład 2. Rejestracja zminnych z włączoną opcją register_globals

<?php
session_register("count");
$count++;
?>

Jeśli włączone są obie opcje, track_vars i register_globals, globalne zmienne i wpisy w $HTTP_SESSION_VARS będą referencjami do tej samej wartości.

Istnieją dwie metody propagacji identyfikatora sesji:

  • Ciasteczka

  • Parametry URL'a

Moduł sesji obsługuje obie metody. Ciasteczka są metodą optymalną, ale ponieważ nie są one pewne (klienci nie muszą ich akceptować), nie możemy na nich polegać. Druga metora wstawia identyfikatory sesji bezpośrednio do URL'i.

PHP może to robić 'przezroczyście' jeśli został skompilowany z opcją --enable-trans-sid. Jeśli włączysz tą opcję, względne URI zostaną automatycznie podmienione tak, aby zawierały identyfikator sesji. Możesz także użyć stałej SID która jest definiowana jeśli klient nie wysłał odpowiedniego ciastka. SID jest albo w postaci nazwa_sesji=id_sesji lub pustym stringiem.

Poniższy przykład demonstruje jak zarejestrować zmienną i jak prawidłowo wstawić link do kolejnej strony korzystając ze stałej SID.

Przykład 3. Zliczanie ilości odwiedzin pojedyńczego użytkownika

<?php
session_register ("count");
$count++;
?>

Witaj gościu. Oglądasz tą stronę <?php echo $count; ?> raz.<p>

<?php
# <?=SID?> jest konieczne do zachowania identyfikatora sesji jeśli
# użytkownik wyłączył ciastka
?>

Aby kontynuować, <A HREF="nextpage.php?<?=SID?>">kliknij tutaj</A>

<?=SID?> nie jest konieczne jeśli przy kompilacji PHP użyta została opcja --enable-trans-sid.

Notatka: PHP zakłada, że bezwzględne URLe odnoszą się do zewnętrznych serwisów, więc nie trzeba przekazywać SID, ponieważ istniałoby niebezpieczeństwo podkradania SIDów przez inny serwer.

Aby zaimplementować przechowywanie danych sesyjnych w bazie danych lub w dowolnej innej postaci, musisz użyć session_set_save_handler() do stworzenia zestawu funkcji przechowujących dane.

System zarządzania sesją obsługuje wiele opcji konfiguracyjnych, które możesz wstawić do swojego pliku php.ini. Oto ich krótki przegląd.

  • session.save_handler definiuje nazwę procedury obsługi, która jest używana do przechowywania i odczytu danych skojarzonych z sesją. Domyślnie files.

  • session.save_path definiuje argument, który jest przekazywany procedurze obsługi zapisu danych. Jeśli wybierzesz domyślną procedurę obsługi, jest to ścieżka gdzie tworzone będą pliki z danymi. Domyślnie /tmp.

    Ostrze¿enie

    Jeśli w tej opcji ustawisz katalog, który jest ogólnie dostępny, jak na przykład /tmp (domyślna wartość), inni użytkownicy serwera będą w stanie przechwycić sesję przez pobranie listy plików z tego katalogu.

  • session.name określa nazwę sesji, która jest używana jako nazwa ciastka. Powinna zawierać tylko znaki alfanumeryczne. Domyślnie PHPSESSID.

  • session.auto_start określa, czy moduł sesji rozpoczyna sesję na początku wywołania. Domyślnie 0 (wyłączony).

  • session.cookie_lifetime określa długość życia w sekundach ciastka przesyłanego do przeglądarki. Wartość 0 oznacza "dopóki przeglądarka nie została zamknięta". Domyślnie 0.

  • session.serialize_handler określa nazwę procedury obsługi, która zostanie użyta do serializacji/odserializacji danych. Obecnie obsługiwany jest wewnętrzny format PHP (nazwa php i WDDX (nazwa wddx). WDDX jest jedynym dostępnym formatem jeśli PHP zostało skompilowane z obsługą WDDX. Domyślnie php.

  • session.gc_probability określa prawdopodobieństwo w procentach rozpoczęcia procedury gc (garbage collection - zbieranie śmieci) przy każdym wywołaniu. Domyślnie 1.

  • session.gc_maxlifetime określa ilość sekund, po jakich dane będą rozpoznawane jako 'śmieci' i usuwane.

  • session.referer_check zawiera podciąg, z którym HTTP_REFERER ma być sprawdzany. Jeśli HTTP_REFERER został wysłany przez klienta i nie zawierał podanego podciągu, identyfikator sesji podany przez takiego klienta zostanie uznany za nieważny. Domyślnie jest to ciąg pusty.

  • session.entropy_file podaje ścieżkę do zewnętrznego zasobu (pliku), który będzie użyty jako dodatkowe źródło entropii w procesie tworzenia identyfikatora sesji. Przykłady to /dev/random lub /dev/urandom, które są dostępne na wielu systemach Unix.

  • session.entropy_length określa liczbę bajtów, która będzie odczytana z pliku podanego powyżej. Domyślnie 0 (wyłączona).

  • session.use_cookies określa czy moduł będzie używał ciasteczek do przechowywania identyfikatora sesji po stronie klienta. Domyślnie 1 (włączona).

  • session.cookie_path określa ścieżkę która będzie podana w session_cookie. Domyślnie /.

  • session.cookie_domain określa domenę która ma być podana w session_cookie. Domyślnie - pusta.

  • session.cache_limiter określa metodę używaną do przechowywania stron sesyjnych w pamięci podręcznej (nocache/private/private_no_expire/public). Domyślnie nocache.

  • session.cache_expire określa czas życia w minutach stron sesyjnych zachowanych w pamięci podręcznej. Nie ma to efektu dla metody nocache. Domyślnie 180

  • session.use_trans_sid określa czy będzie używana obsługa przezroczystego przekazywania identyfikatora sesji. Opcja brana pod uwagę tylko jeśli PHP zostało skompilowane z opcją --enable-trans-sid. Domyślnie 1 (włączona).

  • url_rewriter.tags określa które tagi HTML zostają przepisane w celu dopisania identyfikatora sesji jeśli włączona została opcja przezroczystego przekazywania identyfikatora sesji. Domyślnie a=href,area=href,frame=src,input=src,form=fakeentry

Notatka: Obsługa sesji została dodana w PHP 4.0.

Spis treści
session_start -- Inicjalizuj dane sesji
session_destroy -- Niszczy wszystkie dane zarejestrowane w sesji
session_name -- Pobierz i/lub ustaw nazwę bieżącej sesji
session_module_name -- Pobierz i/lub ustaw moduł bieżącej sesji
session_save_path -- Pobierz i/lub ustaw ścieżkę zapisu bieżącej sesji
session_id -- Pobierz i/lub ustaw identyfikator bieżącej sesji
session_register --  Zarejestruj jedną lub więcej zmiennych w bieżącej sesji
session_unregister --  Wyrejestruj zmienną z bieżącej sesji
session_unset --  Zwolnij wszystkie zmienne sesyjne
session_is_registered --  Sprawdź, czy zmienna jest zarejestrowana w sesji
session_get_cookie_params --  Pobierz parametry ciasteczka sesyjnego
session_set_cookie_params --  Ustaw parametry ciasteczka sesyjnego
session_decode -- Dekoduje dane sesji ze stringu
session_encode --  Koduje dane bieżącej sesji do postaci stringu
session_set_save_handler --  Ustawia funkcje użytkownika do przechowywania sesji
session_cache_limiter --  Pobierz i/lub ustaw bieżący ogranicznik pamięci podręcznej
session_cache_expire -- Zwróć bieżący czas przedawnienia pamięci podręcznej
session_write_close -- Zapisz dane i zakończ sesję