CXI. 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 obsł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 niezdefiniowane. 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.

Notatka: Od wersji PHP 4.1.0 dostępna jest globalna zmienna $_SESSION, podobnie jak $_POST, $_GET, $_REQUEST i tak dalej. W odróżnieniu od $HTTP_SESSION_VARS, $_SESSION jest zawsze globalna. W związku z tym global nie powinno być użyte do $_SESSION.

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_start
();
if (isset(
$HTTP_SESSION_VARS['count'])) {
    
$HTTP_SESSION_VARS['count']++;
}
else {
    
$HTTP_SESSION_VARS['count'] = 0;
}
?>

Użycie $_SESSION (lub $HTTP_SESSION_VARS dla wersji PHP 4.0.6 i starszych) jest wskazane ze względów bezpieczeństwa i czytelności kodu. Używając $_SESSION lub $HTTP_SESSION_VARS nie ma potrzeby używać funkcji session_register()/session_unregister()/session_is_registered(). Użytkownicy mogą uzyskiwać dostęp do zmiennych sesyjnych tak jak do normalnych zmiennych.

Przykład 2. Rejestrowanie zmiennych przez $_SESSION

<?php
session_start
();
// Użyj $HTTP_SESSION_VARS dla PHP 4.0.6 i starszych
if (!isset($_SESSION['count'])) {
    
$_SESSION['count'] = 0;
} else {
    
$_SESSION['count']++;
}
?>

Przykład 3. Wyrejestrowywanie zmiennej korzystając z $_SESSION

<?php
session_start
()
// Użyj $HTTP_SESSION_VARS dla PHP 4.0.6 i starszych
unset($_SESSION['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. Ponieważ PHP musi wiedzieć które globalne zmienne są zarejestrowane jako zmienne sesyjne, użytkownik musi użyć funkcji session_register() podczas gdy $HTTP_SESSION_VARS/$_SESSION nie muszą używać session_register().

Uwaga!

Jeśli używane są tablice $HTTP_SESSION_VARS/$_SESSION i i wyłączona jest opcja register_globals, nie powinno się używać session_register(), session_is_registered() i session_unregister().

Jeśli włączona zostanie opcja register_globals, powinno się używać session_unregister() ponieważ zmienne sesyjne są rejestrowane jako zmienne globalne kiedy dane sesyjne są deserializowane. Wyłączenie register_globals jest zalecane ze względów bezpieczeństwa i wydajności.

Przykład 4. Rejestracja zmiennych z włączoną opcją register_globals

<?php
if (!session_is_registered('count')) {
    
session_register('count');
    
$count = 0;
}
else {
    
$count++;
}
?>

Jeśli włączone są obie opcje, track_vars i register_globals, globalne zmienne i wpisy w $HTTP_SESSION_VARS/$_SESSION będą referencjami do tej samej, już zarejestrowanej zmiennej.

Jeśli użytkownik użyje session_register() do zarejestrowania zmiennej sesyjnej, $HTTP_SESSION_VARS/$_SESSION nie będą zawierały tych zmiennych w tablicy dopóki nie zostanie ona odczytana z miejsca przechowywania sesji (np. do czasu następnego wywołania).

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.

Notatka: Dyrektywa arg_separator.output którą można umieścić w pliku konfiguracyjnym php.ini pozwala ustawić własny separator argumentów.

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 5. Zliczanie ilości odwiedzin pojedyńczego użytkownika

<?php
if (!session_is_registered('count')) {
    
session_register('count');
    
$count = 1;
}
else {
    
$count++;
}
?>

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

<?php
# <?php echo SID?> (<?=SID?> może być użyte jeśli włączona jest możliwość
# używania krótkich tagów) jest konieczne do zachowania identyfikatora
# sesji jeśli użytkownik wyłączył ciastka
?>

Aby kontynuować, <A HREF="nextpage.php?<?php echo 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. JeÅ›li głębokość Å›cieżki okreÅ›lonej w parametrze session.save_path jest wiÄ™ksza niż 2, nie przeprowadzone zostanie zbieranie Å›mieci.

    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.use_only_cookies okreÅ›la czy moduÅ‚ bÄ™dzie używaÅ‚ tylko ciasteczek do przechowywania identyfikatora sesji po stronie klienta. DomyÅ›lna wartość to 0 (dla wstecznej kompatybilnoÅ›ci). Włączenie tej opcji zapobiega atakom opartym o przekazywanie identyfikatora sesji przez URL. Ta opcja zostaÅ‚a dodana w PHP 4.3.0.

  • 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_cache_expire -- Zwróć bieżący czas przedawnienia pamiÄ™ci podrÄ™cznej
session_cache_limiter --  Pobierz i/lub ustaw bieżący ogranicznik pamiÄ™ci podrÄ™cznej
session_commit -- Alias of session_write_close()
session_decode -- Dekoduje dane sesji ze stringu
session_destroy -- Niszczy wszystkie dane zarejestrowane w sesji
session_encode --  Koduje dane bieżącej sesji do postaci ciÄ…gu tekstowego
session_get_cookie_params --  Pobierz parametry ciasteczka sesyjnego
session_id -- Pobierz i/lub ustaw identyfikator bieżącej sesji
session_is_registered --  Sprawdź czy globalna zmienna jest zarejestrowana w sesji
session_module_name -- Pobierz i/lub ustaw moduÅ‚ bieżącej sesji
session_name -- Pobierz i/lub ustaw nazwÄ™ bieżącej sesji
session_regenerate_id --  Update the current session id with a newly generated one
session_register --  Zarejestruj jednÄ… lub wiÄ™cej zmiennych globalnych w bieżącej sesji
session_save_path -- Pobierz i/lub ustaw Å›cieżkÄ™ zapisu bieżącej sesji
session_set_cookie_params --  Ustaw parametry ciasteczka sesyjnego
session_set_save_handler --  Ustawia funkcje użytkownika do przechowywania sesji
session_start -- Inicjalizuj dane sesji
session_unregister --  Wyrejestruj zmiennÄ… globalnÄ… z bieżącej sesji
session_unset --  Zwolnij wszystkie zmienne sesyjne
session_write_close -- Zapisz dane i zakoÅ„cz sesjÄ™


zamki polskie


print 'Macna 1171501954' . "\n"; // ROBERT print 'kaski shark 1171501976' . "\n"; print 'Czyszczenie żaluzji Katowice 1171501749' . "\n"; print 'Odszkodowania 1171501941' . "\n";