Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> standardowa sesje vs sesja w bazie
nospor
post 30.01.2017, 23:09:31
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Prowadzil ktos z was jakies porownania wydajnosciowe w sprawie trzymania sesji w bazie vs sesja standardowa? Sa to jakies duzo roznice na niekorzysc sesji w bazie?

A jak teraz dodac do tego fakt, ze chcemy na biezaca znac aktywnych userow, to na standardowej sesji musimy dodawac dodatkowe rzeczy do bazy odnosnie zalogowanych userow i tak czy siak robic za kazdym razem odwolania do bazy. Zas przy sesji w bazie juz to wszystko nam odpada bo mamy sesje i tak w bazie i statad mozemy sobie wszystko pobrac. W tym przypadku juz tak duzej roznicy byc nie powinno.

Ktos cos?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kayman
post 30.01.2017, 23:23:23
Post #2





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

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


jeżeli sesja w bazie to takiej działającej na zasadzie klucz->wartość np redis, w jakiejkolwiek sql'owej to imo bardzo zły pomysł

no chyba że apka jest dla kilku/kilkudziesięciu userów to można się bawić w takie cuda

ogólnie zwykła na pikach > sql'owa
Go to the top of the page
+Quote Post
by_ikar
post 31.01.2017, 11:44:10
Post #3





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Sesja w plikach - każdy zapis/odczyt to dodatkowe i/o dla dysku;
Sesja w bazie - jeżeli ustawisz sobie tabelę/kolekcje jako "in memory", to wciąż możesz odwoływać się do tych danych ale unikasz operacji bezpośrednio na dysku.
Go to the top of the page
+Quote Post
redeemer
post 31.01.2017, 12:38:57
Post #4





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Dodatkowo w środowiskach rozproszonych, gdzie aplikacja jest "zreplikowana" na n węzłow jest to "must-have".


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 31.01.2017, 12:45:27
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Sesja powinna być trzymana w takim miejscu żeby przy skalowalnej aplikacji Round Robin móc odczytać sesję. Może to być BD, może to być Redis (preferowany) albo shared storage.
Go to the top of the page
+Quote Post
nospor
post 31.01.2017, 20:33:11
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ok, dzieki za opinie smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
daro0
post 31.01.2017, 20:42:22
Post #7





Grupa: Zarejestrowani
Postów: 88
Pomógł: 12
Dołączył: 17.09.2014
Skąd: Krasnystaw

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


Niektóre frameworki, analizując FileStore zapisują pliki sesyjne np. w taki oto sposób

1)

app/storage/sessions/39/39ebd687d09eee8ded5e0a068ff6f8ff1376da15.sess
app/storage/sessions/3a/3af89014f96216b57a47fb7c5f316cb74b3b9162.sess
app/storage/sessions/7b/7bf3bb4a4cc5a24e1af3ad642d48f06d77158671.sess

a w nich serializowane dane.

Natomiast w domyślnej natywnej sesji jest jakiś katalog tmp a w nim pliki

2)
sess_ivg4t5j1k5f86ftu3mv89l1f65
sess_05md2phru9d1vihl99ic7kae55
sess_6lp60ho8lvvv9psou17h3o4pe2

i też to samo, serializacja

Czyli w 1) jest to porozrzucane a właściwie to uporządkowane w tych 2 znakowych podkatalogach, tutaj nazwy plików to sha1 na bazie jakiegoś unique id sesji, może być to też md5 ale też nie tak że wszystkie pliki w jednym katalogu ale w sumie w 256 2-znakowych podkatalogach.

Ktoś brał pod uwagę:

1) jeśli tych plików jest i z kilka milionów
2) ustawienia odśmiecania (np. 1%, 2% itd...)


Co do bazy danych to weźmy taką tabelę:

  1. CREATE TABLE `sessions` (
  2. `session_id` VARCHAR( 24 ) NOT NULL,
  3. `last_active` INT UNSIGNED NOT NULL,
  4. `contents` TEXT NOT NULL,
  5. PRIMARY KEY ( `session_id` ),
  6. INDEX ( `last_active` )
  7. ) ENGINE = MYISAM ;


I zapis do contents danych przy użyciu jeszcze dodatkowo base64encode

I teraz tak:

Jak to się wszystko ma do

a) szybkości
cool.gif niezawodności (bo ja mając stronę na jakimś bezpłatnym hostingu obserwowałem swego czasu wywalanie się sesji natywnej z p. 2), były często, czego już nie było jak tylko zmieniłem sposób składowania, nie wiem dlaczego

No i jeszcze weźmy pod uwagę składowanie:

1. MongoDB
2. SSDB

Czy 1. jest też często stosowane? SSDB jest chyba jakąś alternatywą dla Redisa, przynajmniej tak mi się wydaje. Jakie macie tutaj doświadczenia?
Go to the top of the page
+Quote Post
by_ikar
post 1.02.2017, 08:19:31
Post #8





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


@daro wrzucanie zserializowanych danych do bazy to czysta głupota. Już takie kwiatki jak JSON jako string w mysql widziałem i odradzam to każdemu.

Postawienie mongo do sessji też jest średnim pomysłem, bo lepszy jest już redis, a przy tym sporo lżejszy. Ewentualnie memcache.
Go to the top of the page
+Quote Post
Pyton_000
post 1.02.2017, 08:33:22
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


nie próbowałbym SSDB to jakaś dziwna chińska maszynka smile.gif Skoro to jest alternatywa dla Redisa to nie widzę potrzeby stawiania kolejnego storage.
Mongo tak samo, jeśli da się użyc czegoś innego co już mamy i spełnia to wymagania to nie ma co mnożyć usług.

No chyba że mamy mega duży ruch i potrzebujemy wydajnego rozwiązania które zastąpi obecne kulejące.
Go to the top of the page
+Quote Post
viking
post 1.02.2017, 08:59:23
Post #10





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Cytat(by_ikar @ 1.02.2017, 08:19:31 ) *
@daro wrzucanie zserializowanych danych do bazy to czysta głupota. Już takie kwiatki jak JSON jako string w mysql widziałem i odradzam to każdemu.


Ale zdajesz sobie sprawę że goła sesja w PHP serializuje/deserializuje automatycznie wszystkie dane zawarte w $_SESSION?


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 1.02.2017, 09:32:02
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Goła tak, customowa nie musi ale i tak nie widzę powodu żeby tego nie robić smile.gif
Go to the top of the page
+Quote Post
daro0
post 1.02.2017, 13:29:54
Post #12





Grupa: Zarejestrowani
Postów: 88
Pomógł: 12
Dołączył: 17.09.2014
Skąd: Krasnystaw

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


Dla ścisłości chodzi o takie coś

  1. $contents = base64_encode(serialize($data));


I to jest wysyłane do odpowiedniego pola w bazie. I proces odwrotny przy odczycie.
Go to the top of the page
+Quote Post
Boshi
post 1.02.2017, 13:45:41
Post #13





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


Cytat(by_ikar @ 1.02.2017, 08:19:31 ) *
@daro wrzucanie zserializowanych danych do bazy to czysta głupota. Już takie kwiatki jak JSON jako string w mysql widziałem i odradzam to każdemu.

Postawienie mongo do sessji też jest średnim pomysłem, bo lepszy jest już redis, a przy tym sporo lżejszy. Ewentualnie memcache.


No właśnie mam pytanie odnośnie pierwszego. Czemu to jest złe? kiedyś się zastanawiałem czy warto zapisać do mysql zserializowaną tablicę (mniej rekordów) a potem deserializować.. ale w sumie doszedłem jakoś do wniosku, że lepiej walnąć 100 rekordów niż jeden z tablicą, choć nie pamiętam co mnie przekonało do tego.
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: 21.06.2025 - 08:21