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