Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zmienne $_Session i sesja w bazie danych
gcdreak
post 20.02.2010, 23:32:19
Post #1





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
wookieb
post 20.02.2010, 23:38:31
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




php.pl -> session handler


--------------------
Go to the top of the page
+Quote Post
gothye
post 20.02.2010, 23:45:55
Post #3





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

Ostrzeżenie: (0%)
-----


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



--------------------
Nie udzielam pomocy poprzez PW
Go to the top of the page
+Quote Post
wookieb
post 20.02.2010, 23:47:25
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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?


--------------------
Go to the top of the page
+Quote Post
gcdreak
post 21.02.2010, 00:16:56
Post #5





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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();

Go to the top of the page
+Quote Post
wookieb
post 21.02.2010, 00:41:17
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 21.02.2010, 00:43:14


--------------------
Go to the top of the page
+Quote Post
gcdreak
post 21.02.2010, 10:14:11
Post #7





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
wookieb
post 21.02.2010, 10:46:39
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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

Ten post edytował wookieb 21.02.2010, 10:58:45


--------------------
Go to the top of the page
+Quote Post
gcdreak
post 21.02.2010, 11:14:07
Post #9





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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".


Go to the top of the page
+Quote Post
wookieb
post 21.02.2010, 11:33:13
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Jak sprawdzisz podaj wyniki. Sprawdźmy na ile można ufać książkom.


--------------------
Go to the top of the page
+Quote Post
gcdreak
post 21.02.2010, 11:48:42
Post #11





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
wookieb
post 21.02.2010, 11:55:10
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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

Ten post edytował wookieb 21.02.2010, 11:56:20


--------------------
Go to the top of the page
+Quote Post
gcdreak
post 21.02.2010, 12:15:47
Post #13





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
wookieb
post 21.02.2010, 12:22:04
Post #14





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
gcdreak
post 21.02.2010, 12:54:25
Post #15





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

Ostrzeżenie: (0%)
-----


Nie bo mam tam jeszcze inne pierdoły.
Go to the top of the page
+Quote Post
wookieb
post 21.02.2010, 14:40:21
Post #16





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:25