Podstrony
- Strona startowa
- Mikser analogowy ALLEN&HEATH seria PA i CP. Instrukcja PL
- [eBooks.PL]Praca Magisterska Projekt serwisu informacyjnego WWW
- Terry Pratchett Discworld 23 PL Carpe Jugulum
- adobe.photoshop.7.pl.podręcznik.uzytkownika.[osloskop.net]
- Adobe.Photoshop.7.PL.podręcznik.uzytkownika.[emulek.net]
- Linux. .Mandrake.10.Podręcznik.Użytkownika.[eBook.PL] (3)
- Maciarewicz Antoni Raport o działaniach służb specjalnych MON
- Professional Feature Writing Bruce Garrison
- Fenix 1'90 Opowiadania
- Wobroniewolnosci
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- plazow.keep.pl
[ Pobierz całość w formacie PDF ]
.W tym przypadku jest to bezwzględny adres URL, chociaż strona ta znajduje się na tym samym serwerze.PHPuzupełnia jedynie adresy URL zapisane w postaci łączy względnych.Do przykładu został dołączony formularz, ponieważ PHP potrafi również uzupełniać formularz tak, abyzawierał on wartość identyfikatora sesji.Oznacza to, że aplikacja korzystająca z formularzy również będzieprawidłowo działała.Jedyną wadą tego mechanizmu jest to, że działa on jedynie dla metody POST.Jeżeli będzieszchciał użyć formularza korzystającego z metody GET, aplikacja nie będzie działała prawidłowo.Mimo, że atrybutACTION zostanie prawidłowo zmodyfikowany, przeglądarka nie dodaje zmiennej PHPSESSID do ciągu zapytania(przetestowane na najnowszych wersjach Netscape i Internet Explorer).Rozdział 7 Sesje i stan aplikacji84Przesyłanie identyfikatora sesji za pomocą metod GET i POST pozwala uniknąć niektórych problemów zcookie i jest łatwe do zrealizowania.Jeżeli zamierzasz skorzystać z automatycznego uzupełniania adresów,powinieneś również się zastanowić, jaki wpływ będzie to miało na wydajność aplikacji.PHP musi przecieżpodczas każdego uruchomienia strony odszukać wszystkie łącza na stronie i zmienić URL.Aby sprawdzić wpływ tego mechanizmu na wydajność stworzyłem przykładową stronę WWW orazskrypt, który odczytywał ją z serwera i zapamiętywał czas potrzebny na jej odczytanie.Przykładowa stronazawierała 14 łączy z których 12 było łączami względnymi, które wymagały przepisania.Strona miała wielkość9,55 kB.Użyłem skryptu z wydruku 7.6 do odczytania strony kolejno 1000 razy.Skrypt uruchamiałem z aktywnąopcją --enable-trans-sid, oraz bez niej.Wydruk 7.6.Skrypt do sprawdzania wydajnościAby pokazać w jaki sposób PHP wywołuje nowe funkcje, użyjemy skryptu z wydruku 7.8.Dodatkowoustawiłem wartość session.gc_probability na 100, więc funkcja czyszczenia pamięci jest wywoływana napoczątku każdej sesji.Wydruk 7.8.Testowanie mysession.phpWłasny mechanizm obsługi sesjiRozdział 7 Sesje i stan aplikacji86Rysunek 7.4.Wynikdziałania skryptumysession.phpGdy uruchomiłem ten skrypt, wynik nie był taki, jakiego się spodziewałem.W przeglądarce nie byłoinformacji na temat wywołania funkcji write() i close().Jak można zauważyć dodałem nawet dodatkowąinstrukcję print() aby dokładniej sprawdzić co się stało.Wynik w przeglądarce jednak nadal nie był prawidłowy.Po dokładniejszym sprawdzeniu odkryłem, że wynik działania obu funkcji znajduje się w pliku error_log serweraApache.Oznacza to, że w którymś momencie wyjście zostało tymczasowo przekierowane z stdout na stderr.Wwyniku tego przekierowania nie można wysłać żadnych danych do przeglądarki zarówno w funkcji write(), jak iclose().Problem ten jednak nie wpływa na właściwy system obsługi sesji.Trzeba powiedzieć, że ten efet możenie powtórzyć się w przypadku użycia innej platformy i serwera, ponieważ sposób obsługi standardowegowyjścia danych i błędów może być inny.Na przykład w przypadku serwera Xitami działającego na Windowswidoczne były wszystkie spodziewane dane.Po poznaniu zasady działania mechanizmu, stworzenie prawdziwego mechanizmu obsługi sesji będziedosyć łatwe.Jeżeli chcesz używać zmiennych sesji, powinieneś przechowywać je w bazie danych a nie w pliku.Idea ta może być z początku mało zrozumiała, ale należy pamiętać, że zapisywanie danych aplikacji na serwerzeWWW może ograniczać skalowalność aplikacji.Jeżeli aplikacja zostanie rozdzielona na kilka serwerów WWW izastosowany zostanie mechanizm równoważenia obciążenia pomiędzy serwerami, użycie plików do obsługi sesjimoże spowodować załamanie aplikacji.Awaria ta będzie wynikała z tego, że każde żądanie może być kierowanedo innego serwera w klastrze.Jeżeli początkowe dane zostaną zapisane na serwerze pierwszym, a kolejne żądaniebędzie przekazane do serwera dwa, to dane sesji będą nieosiągalne.Jeżeli wszystkie dane sesji będąprzechowywane w bazie danych, zmienne sesji będą dostępne dla wszystkich serwerów WWW w klasterze.Następny wydruk zawiera prosty przykład użycia bazy danych MySQL do przechowywania danych sesji.W celu poprawienia czytelności kodu, przykład korzysta z klasy DB_Sql pochodzącej z pakietu PHPLIBomówionej w rozdziale 6 Współpraca z bazami danych.Do przechowywania danych sesji korzystamy z tabelizdefiniowanej w następujący sposób:CREATE TABLE Sessions(SessionId char(32) not null,LastUpdated datetime not null,DataValue text,PRIMARY KEY (SessionID),INDEX (LastUpdated ));Tabela ta zawiera pole do przechowywania identyfikatora sesji, pole data/czas do zapamiętywania czasuostatniej zmiany oraz dane w postaci pola tekstowego typu BLOB.Pole LastUpdated posiada indeks w celupoprawienia wydajności w trakcie odzyskiwania nieużytków.Cały kod funkcji obsługi sesji zamieszczony jest nawydruku 7.9.Wydruk 7.9.Obsługa sesji przy użyciu bazy danych MySQLquery( $aSQL );if ( $aDB->num_rows() == 1 ){$aDB->next_record();$aData = $aDB->f( "DataValue" );return $aData;}else{// Wstaw wiersz dla bieżącej sesji aby uprościć funkcję write$aSQL = "insert into Sessions values ( '$aKey', NOW(), '' )";$aDB->query( $aSQL );return "";}}function mysess_write( $aKey, $aVal ){$aDB = new MySQLDB;$aData = addslashes( $aVal );$aSQL = "update Sessions set DataValue='$aData', ";$aSQL.= "LastUpdated=NOW() where SessionID='$aKey'";$aDB->query( $aSQL );return True;}function mysess_destroy( $aKey ){$aDB = new MySQLDB;$aSQL = "delete from Sessions where SessionID = '$aKey'";$aDB->query( $aSQL );return True;}function mysess_gc( $aMaxLifetime ){$aDB = new MySQLDB;$aSQL = "delete from Sessions where UNIX_TIMESTAMP(NOW()) ";$aSQL.= "- UNIX_TIMESTAMP(LastUpdated) > $aMaxLifetime";$aDB->query( $aSQL );return True;}session_set_save_handler("mysess_open", "mysess_close", "mysess_read","mysess_write", "mysess_destroy", "mysess_gc");?>Kod z wydruku jest całkiem prosty jak na tak dużą zmianę mechanizmu obsługi sesji.Funkcjemysess_open() i mysess_close() nie są w tym przypadku używane, ponieważ nie są potrzebne.Wszystkie danesesji są przechowywane w jednej tabeli, więc wartości przekazane do mysess_open() nie są używane, a pozakończeniu sesji nie trzeba niczego usuwać.Interesującymi funkcjami są mysess_read(), mysess_write(), mysess_destroy() oraz mysess_gc().Wfunkcji mysess_read() do bazy jest kierowane zapytanie mające za zadanie odczytać dane związane zidentyfikatorem sesji.Jeżeli dane te zostaną odnalezione są zwracane.Jeżeli nie ma jeszcze rekordu w bazie,tworzony jest nowy rekord z pustym polem DataValue i zwracany jest pusty ciąg ("").Powodem takiego działaniajest to, że gdy pózniej będą zapisywane dane sesji nie będzie konieczności sprawdzania, czy istnieje jużodpowiedni rekord w bazie danych.Funkcja mysess_write() za każdym wywołaniem uaktualnia pola DataValue oraz LastUpdated.Funkcjamysess_destroy() usuwa rekord związany z identyfikatorem sesji.Funkcja mysess_gc() usuwa wszystkie wiersze,których wartość pola LastUpdated wskazuje że nie rekord nie był uaktualniany przez ostatnie $aMaxLifetimesekund.Poniższy kod pokazuje sposób wykorzystania mechanizmu sesji partego o bazę danych
[ Pobierz całość w formacie PDF ]