WebDeveloper
 g│≤wna | forum manual | skrypty |  artyku│y |  projekty | porady |  zasoby |  linki 
dzia│y
  •  manual PHP
  •  skrypty PHP
  •  artyku│y
  •  projekty
  •  porady
  •  zasoby
  •  linki
  •  
    forum
  •  php
  •  apache
  •  mysql
  •  postgresql
  •  faq php
  •  pomocnik php
  •  
    news
  • Porcjowanie wynik≤w zapytania
  • Kartki Internetowe
  • PHP + MySQL + Windows 98
  • Bezpieczne uploadowanie plik≤w
  • Przegl▒danie obrazk≤w z bazy PostgreSql.
  • Co to jest WebDeveloper?
  • Instalujemy serwer baz danych !
  • Sesje w PHP4 !
  • Dodaj poradΩ !!!
  • Zastosowano... PHP !
  • redakcja

    Je╢li masz ciekawe informacje odno╢nie PHP, skrypty, porady, linki itp. lub chcia│by╢ wsp≤│tworzyµ serwis PHP.zone.pl daj nam znaµ na email !



    dodaj poradΩ !


    Powered by:
    PHP
    Apache
    MySql
    Linux

    users online: 8

    Artyku│y

    Obs│uga sesji w PHP 4.0 (1)
    autor: Hubert Mierzwiak

    Pierwsza czΩ╢µ artyku│u opisuj▒cego mechanizmy zarz▒dzania sesj▒ z poziomu jΩzyka PHP.

    WstΩp

    W przeciwie±stwie do PHP 3, PHP 4.0 posiada zdolno╢µ zarz▒dzania sesjami u┐ytkownik≤w. Sesje pozwalaj▒ w prosty spos≤b ╢ledziµ poczynania poszczeg≤lnych u┐ytkownik≤w podczas kolejnych wizyt na naszej witrynie. Dla po│▒czenia danych sesji z u┐ytkownikiem, kt≤ry je wytworzy│ generowany jest identyfikator sesji (session ID), klucz │▒cz▒cy u┐ytkownika z jego danymi.
    PHP 4.0 posiada wbudowan▒ podstawow▒ obs│ugΩ sesji, kt≤ra uwalnia nas od procesu tworzenia identyfikatora sesji, szeregowania i zapisu danych sesji, brakuje jednak tu kilku rozbudowanych mo┐liwo╢ci dostΩpnych w PHPLib.

    Podstawowe terminy

    Zarz▒dzanie sesjami to mechanizm utrzymuj▒cy informacje (dane) z serii zapyta± HTTP (wizyt) od tego samego u┐ytkownika na przestrzeni pewnego czasu. Termin "sesja" okre╢la tu czas jaki u┐ytkownik spΩdzi│ na konkretnej witrynie. Niestety w protokole HTTP brak jest mechanizm≤w inforuj▒cych o stanie po│▒czenia. Pojedy±cze zapytania HTTP nie musz▒ byµ ze sob▒ powi▒zane. Serwer www nie potrafi rozr≤┐niaµ kolejnych u┐ytkownik≤w, nie wie nic o sesjach konkretnych u┐ytkownik≤w. Zarz▒dzanie sesjami to spos≤b na po│▒czenie danych z u┐ytkownikiem podczas wizyty na witrynie. W artykule stosujΩ termin "sesja" dla okre╢lenia pojedy±czej wizyty u┐ytkownika na witrynie. Dla przyk│adu, typowa sesja online zwi▒zana z zakupami zawiera zalogowanie siΩ, pobranie artyku│≤w do koszyka, z│o┐enie zam≤wienia, podanie adresu (ew. numeru karty kredytowej), wys│anie zam≤wienia, i zamkniΩcie okna przegl▒darki (wylogowanie).
    PHP 4.0 zawiera podstawowe funkcje do zarz▒dzania sesjami u┐ytkownik≤w.
    Czas kiedy sesja jest aktywna okre╢lany jest "┐yciem" sesji.
    "Szeregowanie" (serializing) oznacza przekszta│canie zmiennych do formatu kiedy mog▒ byµ zapisane jako normalny │a±cuch znak≤w (string). Bez mo┐liwo╢ci przekszta│cania zmiennych, nie mo┐liwe by│oby, np. zapisanie tablicy PHP w bazie danych. Szeregowanie danych jest pomocne przy przechowywaniu danych pomiΩdzy kolejnymi wizytami. Mo┐esz u┐ywaµ funkcji serialize() i deserialize(), choµ w PHP3 funkcje te nie pracuj▒ w│a╢ciwie na obiektach (klasach).

    Podstawowe informacje

    Bibilioteka zarz▒dzania sesj▒ u┐yta w PHP oferuje mo┐liwo╢ci jakie udostΩpnia wiΩkszo╢µ bibliotek zarz▒dzania sesj▒:

    . Zapisuje dane sesji na serwerze. DziΩki temu, ┐e biblioteka u┐ywa r≤┐nych modu│≤w magazynowania danych, mo┐liwe jest przechowywanie danych w plikach tekstowych, pamiΩci dzielonej, czy bazie danych. Dok│adna lokalizacja danych nie jest wa┐na, je┐eli nie cierpi na tym wydajno╢µ.
    . U┐ywa kodowanego, przypadkowego identyfikatora sesji dla identyfikacji u┐ytkownika.
    . Zapisuje identyfikator sesji (i tylko identyfikator) po stronie klienta u┐ywaj▒c cookies, GET/POST, lub w ╢cie┐ce do skryptu.
    . Je┐eli u┐ytkownik nie obs│uguje cookies, aplikacja mo┐e u┐ywaµ innego sposobu obs│ugi sesji.

    Uruchamianie sesji

    W PHP 4 uruchamianie sesji nastΩpuje po jawnym wywo│aniu funkcji session_start(), lub automatycznie przy rejestrowaniu zmiennej w sesji u┐ywaj▒c session_register(). Zwykle wywo│uje siΩ funkcjΩ session_start() na pocz▒tku strony (skryptu), tak aby zmienne sesji by│y dostΩpne w skrypcie. Nie ma jednak ┐adnej r≤┐nicy, je┐eli rejestrujesz zmienne sesji wywo│uj▒c funkcjΩ session_register() na pocz▒tku skryptu i pomijasz wywo│anie session_start(), poniewa┐ wywo│uj▒c session_register() automatycznie (wewnΩtrznie) jest uruchamiana funkcja session_start() , je┐eli sesja jeszcze nie zosta│a uruchomiona.

    Z chwil▒ uruchomienia sesji:
    . PHP sprawdza czy istnieje wa┐ny identyfikator sesji (session ID)
    . Je┐eli nie istnieje wa┐ny identyfikator sesji, PHP tworzy nowy identyfikator
    . Je┐eli istnieje wa┐ny identyfikator sesji, zamro┐one zmienne tej sesji s▒ reaktywowane i wprowadzane z powrotem do globalnej przestrzeni zmiennych.

    Rejestrowanie zmiennych sesji jest wykonywane komend▒ session_register(). Umo┐liwia ona tworzenie (rejestrowanie) zmiennych, kt≤re s▒ przechowywane przez sesjΩ i dostΩpne podczas sesji. Wszystkie zmienne, kt≤re chcesz przechowywaµ na potrzeby kolejnych wizyt u┐ytkownika na witrynie musz▒ byµ zarejestrowane funkcj▒ session_register(). Argumentem tej funkcji jest nazwa zmiennej, nie sama zmienna ! Aby usun▒µ zmienn▒ z sesji mo┐esz u┐yµ funkcji session_unregister() np. w przypadku, gdy u┐ytkownik usuwa produkt z koszyka.

    Przyk│ad: prosty licznik.
    . startujemy sesjΩ
    . wy╢wietlamy ostatni▒ warto╢µ licznika
    . zwiΩkszamy licznik
    . rejestrujemy licznik

    session_start();
    print($licznik);
    $licznik++;
    session_register("licznik");

    Oczywi╢cie licznik ten zlicza odwiedziny tylko jednego u┐ytkownika, bazuj▒c na zmiennej zawartej w jego sesji. Domy╢lna konfiguracja PHP okre╢la czas ┐ycia cookie do momentu zamkniΩcia okna przegl▒darki (lifetime = 0), wiΩc je╢li zamkniesz okno przegl▒darki i ponownie je otworzysz licznik zwiΩkszy siΩ zn≤w o 1.

    Przyk│ad: rejestrowanie zmiennej $imie

    session_register("imie");

    Przyk│ad: rejestrowanie wcze╢niej zdefiniowanej zmiennej $ulica

    $ulica = "Pomorska";
    $foo = "ulica";
    session_register($foo);


    R≤┐nica w dw≤ch ostatnich przyk│adach polega na tym, ┐e w pierwszym, zmienna "imie" jest rejestrowana jako zmienna sesji, w drugim zmienna o nazwie "ulica". Funkcja session_register() pobiera jako argument nazwΩ zmiennej, a nie sam▒ zmienn▒ !

    úatwo╢µ pos│ugiwania siΩ zmiennymi sesji mo┐na por≤wnaµ do pos│ugiwania siΩ zmiennymi zdefiniowanymi w metodach GET/POST. Je┐eli zarejestrujesz zmienn▒ o nazwie foo, to $foo jest dostΩpna automatycznie zaraz po wywo│aniu funkcji session_start(). Poniewa┐ funkcja serialize() w PHP4 posiada nowe mo┐liwo╢ci, realnym sta│o siΩ u┐ywanie obiekt≤w (klas) jako zmiennych sesji.

    Uwaga: podczas uruchamiania sesji, mo┐e byµ stworzony nowy identyfikator sesji je┐eli sesja zostanie uznana za niewa┐n▒, poniewa┐ u┐ytkownik wchodzi na witrynΩ z nie lokalnej strony (nie ze strony na tej witrynie) je╢li opcja extern_referer_check (uwaga: pojedy±cze "r") jest w│▒czona w pliku konfiguracyjnym PHP. Jest to jedna z metod zapobieganiu wchodzenia u┐ytkownik≤w z innych witryn PHP i przejmowaniu sesji (jest to na razie ma│o prawdopodobne).

    Zamykanie sesji

    Sesja nie jest zamykana automatycznie, poniewa┐ systemowi trudno by│oby okre╢liµ kiedy u┐ytkownik ko±czy sesjΩ.

    R≤┐ne komendy kontroluj▒ zako±czenie sesji przez u┐ytkownika.
    . SesjΩ mo┐na zamkn▒µ funkcj▒ session_destroy().
    . Je┐eli przekazujesz session ID poprzez cookies, pamiΩtaj, ┐e ich czas ┐ycia trwa do chwili zamkniΩcia okna przegl▒darki (lifetime = 0). Jednak mo┐esz okre╢liµ inny czas ┐ycia dla cookie wpisuj▒c odpowiedni▒ warto╢µ w pliku konfiguracyjnym PHP.
    . Mo┐esz u┐yµ dyrektywy konfiguracyjnej gc_maxlifetime do okre╢lenia po jakim czasie od ostatniej sesji dane tej sesji maj▒ byµ skasowane, poniewa┐ serwer nie wie czy cookie wci▒┐ istnieje na komputerze u┐ytkownika. Jednak wykonywanie czyszczenia starych sesji (zwane "garbage collection") przy ka┐dym dostΩpie do strony mo┐e wp│ywaµ na wydajno╢µ, dlatego te┐ r≤wnocze╢nie z opcj▒ gc_maxlifetime, powiniene╢ u┐yµ opcji gc_probability , kt≤ra okre╢la z jakim prawdopodobie±stwem maj▒ byµ wywo│ywane procedury czyszczenia starych sesji. Je┐eli gc_probability wynosi 100, czyszczenie jest wykonywane podczas ka┐dego zapytania (tzn. z prawdopodobie±stwem 100%); je╢li wynosi 1 (domy╢lnie), stare sesje zostan▒ usuniΩte z prawdopodobie±stwem 1% dla ka┐dego zapytania.

    Je╢li nie u┐ywamy cookie, ale przesy│amy identyfikator sesji za pomoc▒ metod GET/ POST, musimy zachowaµ szczeg≤ln▒ ostro┐no╢µ przy u┐ywaniu procedur czyszczenia sesji. U┐ytkownicy mog▒ umie╢ciµ URL ze swoim identyfikatorem w bookmarkach/ulubionych , w tym wypadku nale┐y wykonywaµ cykliczne czyszczenie sesji, poniewa┐ je╢li dane sesji istniej▒ kiedy u┐ytkownik ponownie wchodzi na stronΩ ze swoim identyfikatorem sesji, PHP reasumuje poprzedni▒ sesjΩ zamiast wystartowaµ now▒ sesjΩ. Warto╢µ gc_probability w zakresie 10-20 bΩdzie bardziej odpowiednia dla takiego scenariusza, ani┐eli warto╢µ 1 (czΩ╢ciej bΩd▒ czyszczone stare sesje) .

    Mo┐e zastanawiaµ fakt, dlaczego PHP pozwala zdefiniowaµ prawdopodobie±stwo (gc_probability) okre╢laj▒ce kiedy maj▒ byµ czyszczone stare sesje, zamiast ustalenia czyszczenia co n wywo│a±. Je┐eli PHP u┐ywa│oby funkcji zliczaj▒cych, serwer musia│by kontrolowaµ ilo╢µ otwartych sesji. U┐ywaj▒c prawdopodobie±stwa serwer nie musi przechowywaµ licznik≤w otwartych sesji, przez co jest o wiele szybszy.



    na podstawie:
    "Session Handling with PHP 4.0" Tobias Ratschiller





    komentarze | artyku│y






    kontakt

    autor:

    Hubert Mierzwiak

    wsp≤│praca:

    Piotr Karolak

    Chcesz prowadziµ sw≤j dzia│ tematyczny typu XML, SQL, admin, JavaScript, itp?
    Napisz do nas !
     
    skrypty
  • designer.zip
  • vipAuth.tgz
  • phpCenzura.tgz
  • vip_php.tgz
  • pomocnik_light
  • ankieta
    Co s▒dzisz o stworzeniu FAQ PHP?
    super!
    po co?

    poprzednie

    newsletter

    wpisz sw≤j email i wci╢nij Enter

    linuxnews.pl
  • KRRiTV stra┐nikiem!?
  • Dzisiejsze zebranie...
  • Felieton w warunkach ekstremalnych
  • Nexidion Designer
  • Solaris OpenSource
  • KDE 2.0.1
  • Jest ju┐ nowy Debian...
  • Tydzie± min▒│...




  • Manual | Skrypty | Artyku│y | Projekty
    Porady | Zasoby | Linki
    G│≤wna | Forum

    Copyright 2000 Hubert Mierzwiak