Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmienne $_Session i sesja w bazie danych
Forum PHP.pl > Forum > PHP
gcdreak
Witam!
Do kontroli sesji wykorzystuję bazę danych. Mam jednak system sprawdzania poprawności danych w formularzach oparty o zmienne z $_SESSION. Czy jest możliwość używania tablicy $_SESSION i trzymać sesje w bazie? Jeśli tak to proszę o jakiś przykład.
wookieb
php.pl -> session handler
gothye
również trzymam zmienne sesji w bazie ,ale całkowicie wyeliminowałem stosowanie tablicy $_SESSION 

a całość do obsługi wrzuciłem do klasy ,wiec w Twoim przypadku po co nie potrzebnie duplikować to

wookieb
Cytat(gothye @ 20.02.2010, 23:45:55 ) *
również trzymam zmienne sesji w bazie ,ale całkowicie wyeliminowałem stosowanie tablicy $_SESSION

Możesz podać cel dla jakiego zrezygnowałeś z tej zmiennej?
gcdreak
Mój session handler również nie uwzględnia tablicy $_SESSION, ale z tego co czytam to lepiej, że jej nie uwzględnia.

Problem optymalnego transportu powiadomień o błędnych polach i wartościach pól prawidłowych rozwiązałem za pomocą $_GET, base64_*, *serialize();

wookieb
Cytat(gcdreak @ 21.02.2010, 00:16:56 ) *
ale z tego co czytam to lepiej, że jej nie uwzględnia.

Gdzie wyczytałeś? Na tablicy ogłoszeń w kole gospodyń? Ludzie podajcie argumenty, bo jak dla mnie tniecie sobie żyły na rękach.
gcdreak
Jeśli trzymasz zmienne w tablicy $_SESSIONS to za każdym razem kiedy się do niej odwołujesz PHP deserializuje całą tablicę $_SESSIONS. Jak wiadomo PHP nie jest demonem szybkości i proces serializacji i odwrotny zajmują mu względnie sporo czasu. Jeśli trzymasz sesję w bazie możesz bardzo łatwo serializować i deserializować pojedyncze zmienne sesyjne oszczędzając zasoby. Pewnie znajdą się tacy którzy powiedzą, że łaczenie z bazą jest bardziej zasobożerne - jeśli tak to polecam wam zostać przy starych nawykach. Jeśli ktoś chce sobie tak to zagospodarować to magiczne metody __get() i __set() z pewnością okażą się pomocne
  1. //ustawiamy zmienne
  2. $oSession->foo = 'wyswietl foo';
  3. $oSession->bar = 'wyswietl bar';
  4.  
  5. //odczytujemy zmienne
  6. echo $oSession->foo; // wyswietl foo
  7. echo $oSession->bar; // wyswietl bar
wookieb
Cytat(gcdreak @ 21.02.2010, 10:14:11 ) *
Jeśli trzymasz zmienne w tablicy $_SESSIONS to za każdym razem kiedy się do niej odwołujesz PHP deserializuje całą tablicę $_SESSIONS.


Więc może rozbijmy ten mity z tablicy ogłoszeń
Napisałeś za każdym razem. Bzdura.

http://www.php.net/manual/en/intro.session.php
Cytat
All registered variables are serialized after the request finishes.

Jest napisane, że po zakończeniu żądania sesja jest serializowana oraz zapisywana. Gdyby twoja teoria była prawdziwa, sesja musiałaby być serializowana za każdym razem, gdy tylko coś do niej wrzucimy, ale jak widzisz tak nie jest.
Dodatkowo dla testu, zrobiłem licznik wywołań metody read i write w session_handlerze i było to tylko 1 raz dla odczytania wartości i 1 raz dla zapisania wszystkich danych bez względu na ilość operacji wykonywanych na $_SESSION.

Cytat
Jak wiadomo PHP nie jest demonem szybkości i proces serializacji i odwrotny zajmują mu względnie sporo czasu. Jeśli trzymasz sesję w bazie możesz bardzo łatwo serializować i deserializować pojedyncze zmienne sesyjne oszczędzając zasoby.

Rozdzielasz poszczegolne zmienne sesji na pola w bazie? (nie mówię, że to złe ale strasznie ograniczające)
Proszę w takim razie pokaż swojego session handlera.
Tak naprawdę proces odserializowania i serializowania jest nawet szybszy gdybyś dane zapisał jawnie w pliku
  1. $tablica_z_danymi = array('blablabla');
a potem je includował. Sprawdzone, zmierzone, potwierdzone, nie zaufane byle pierwszemu kolesiowi co pisze arty w necie.

Ale jak się upierasz, to zmierz prędkość działania twojej sesji a sesji phpowej. Przypominam, że pomiary dobrze jest wykonywać w ten sposób
  1.  
  2. $start = microtime(true);
  3. for($i =0 ; $i<1000; $i++)
  4. {
  5. // kod do zmierzenia
  6. }
  7. echo microtime(true) - $start;

Jeżeli udowodnisz wyższość swojej teorii to będę gotowy się pokłonić smile.gif
gcdreak
Cytat
Sprawdzone, zmierzone, potwierdzone, nie zaufane byle pierwszemu kolesiowi co pisze arty w necie.


Nie znalazłem tego w necie a w jednej z najlepszych książek jakie ukazały się na naszym rynku dotyczących PHP(PHP Programowanie zaawansowane).

Aż z ciekawości sprawdzę sobie ten "stoper".


wookieb
Jak sprawdzisz podaj wyniki. Sprawdźmy na ile można ufać książkom.
gcdreak
Nie można!
Różnica jest ogromna. Zapis do bazy jest ok 100 wolniejszy od wykorzystania tablicy $_SESSION.
Może ktoś zauważa jakieś plusy zapisywania zmiennych w DB?

@wookieb
Możesz pokazać kawałek twojego handlera z metodami bezpośrednio związanymi z zapisem i odczytem zmiennych sesyjnych?
wookieb
Nie pokażę ponieważ jest tam za dużo innych kodów, które tylko zaciemnią sytuację. Nie powinien być aż tak wolny. Jak przeprowadzałem test, to chodziło mi między innymi o to czy odczyt z tablicy $_SESSION jest wolniejszy niż z obiektu i tak nie było.

Jeżeli chodzi o zapis do bazy rzeczywiście jest delikatniej wolniejszy. Nie wiem jak mierzyłeś, fajnie by było gdybyś to pokazał.

Co do session handlera, wiec najprostsze metody to po prostu odczytanie wartosci z bazy o określonym id. (zaznaczam by założyć index na session_id w bazie). Zapis to zwykły insert z ON DUPLICATE.

Co daje sesja w bazie:
Możliwość wylogowania danego użytkownika
Sprawdzenie kto jest zalogowany
Ogólnie kontrolę nad sesją użytkowników
Sprawdzenie kto jak długo siedzi na stronie

i wiele innych
gcdreak
Nie chodziło mi o zalety sesji w bazie a o zalety trzymania zmiennych sesji w bazie.

Robiłem to tak jak napisałeś
  1.  
  2. // $o = new Session(new DB);
  3.  
  4.  
  5. $start = microtime(true);
  6. for($i = 0 ; $i < 1000; $i++) {
  7. // $o->vars = 'zawartość';
  8. $_SESSION['vars'.$i] = 'zawartość'.$i;
  9. }
  10. echo microtime(true) - $start;
wookieb
Pokaż jeszcze kod swojej klasy Session.

Raczej nie ma ogromnej zalety trzymania danych w bazie. Już lepiej je trzymać na plikach a do bazy zapisywałbyś tylko to chcesz.
gcdreak
Nie bo mam tam jeszcze inne pierdoły.
wookieb
Proces zapisania i odczytania danej w sesji powinein odbywać się tylko raz (przeczytaj artykul na php.pl dotyczacy session handlera oraz o funkcji http://pl.php.net/session_set_save_handler ). Dzięki session_set_save_handler tak wlasnie sie dzieje. Wiec nie wiem skad otrzymales 100 razy wolniejszy wynik. Jak się zapoznasz to wtedy możesz zadać pytania.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.