Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sesje + baza danych -> własna obsługa
Forum PHP.pl > Forum > PHP
chaos_code
Witam smile.gif

Mama zamiar zrobić obsługę sesji na mysql-u. Trochę poczytałem coś tam już wiem...
Ale naszła mnie taka refleksja. Czy koniecznie muszę korzystać z wbudowanego mechanizmu tj.
session_start, session_set_save_handler (open, write, gc, destroy,...), bo skoro i tak już muszę się w to bawić, czy nie lepiej od początku napisać samemu?

Może jest coś o czym nie wiem, a co daje przewagę standardowemu rozwiązaniu?

I przy okazji. Wiecie może jak generowane jest ID sesji. Wiem, że losowo, tylko czy jest to zwykły random (coś mi się obiło, ze nie do końca losuje liczby losowe - chyba w pascalu tak było) lub może jakiś bardziej zaawansowany algorytm?

Z góry dziękuję. smile.gif
misiek172
ja bym wolał sesje standardowe... ale to wszystko zależy od twoich potrzeb smile.gif

A jeśli chodzi o generowanie id, to wydaje mi się że to losowe ale głowy nie dam smile.gif

Ale można sobie własny id sesji wygenerować tylko warunek jeden jest taki, iż musi mieć odpowiednią ilość znaków.

i potem wygenerowany id wsadzasz: session_id($id_wygenerowany); session_start();

// nie sprawdzałem ale na logikię powinno chodzić smile.gif
chaos_code
session_id - generowana losowo na pewno, gdyby było inaczej to by raczej bezpiecznie nie było, znaczy tak myślę winksmiley.jpg

Ze można wygenerować, to wiem - tyle czy zwykły random będzie wystarczający. A może w php jest jakaś standardowa funkcja generująca id_session (oczywiście oprócz session_start)

A generowanie identyfikatora sesji potrzebne by mi było w przypadku kiedy olałby całkowicie standardowe rozwiązanie. W sumie moje nie za dużo różniłoby się od standardowego, bo i cała logika musi być podobna.

Tyle, że nie chce mi się grzebać w tym kiedy uruchamia się read, write, open, gc, destroy, close i dodatkowo ich obsługą, że ten musi zwracać pusty ciąg, ten true, a inny może false.

Dlatego też chciałem zaciągnąć Waszych opinii. smile.gif

Bo rozwiązanie będzie to samo.
1. Generuje ID
2. zapisuje u klienta w cookie oraz w bazie

3. przy każdym żądaniu strony odczytuje ID od klienta i porównuje z tym w bazie

+ sprawdzanie stanu nieaktywności klienta, przedłużanie ważności sesji, kasowanie sesji...


Tylko czy olanie session_start i tych wszystkich bajerów będzie miało jakieś skutki uboczne?
Void(Null)
Możesz użyć SUPER banalnej metody "trzymania sesji" która wygląda mniej więcej tak:

Najpierw określasz czas takiej niby sesji:

  1. <?php
  2. $SID_time = 900000;// 15 minut w milisekundach
  3. ?>


Przy rejestracji takiej sesji (np. podczas pierwszego logowania) korzystasz z takiej funkcji:

  1. <?php
  2. $SID = date("U");
  3. ?>


PHP tworzy za pomocą funkcji Date() uniksowy "odcisk chwili logowania" czyli zmienna $SID będzie zawierać liczbę sekund od Uniksowej epoki (od 1 stycznia 1970 00:00:00 GMT). Może wyglądać np tak:

  1. <?php
  2. $SID=1178746713
  3. ?>


Teraz sprawa polega na tym aby sprawdzić czy od czasu logowania nie upłyneło więcej czasu niż określiłeś w $SID_time. Np tak:

  1. <?php
  2. $check = date("U");
  3. if ($SID=="" OR $SID+$SID_time < $check ) {
  4. //Sesja zakończona
  5. }else{
  6. //Nie zakończona
  7. }
  8. ?>


Dalej - kod sprawdzania musisz wykonywać w każdym miejscu. Możesz do tego użyć include - jeśli nie wiesz co to, napisz.

Gdybyś zaś chciał utworzyć zmienną typu "token" (jak w phpMyAdmin) czyli ciąg różnych alfanumerycznych znaków możesz zrobić tak:

  1. <?php
  2. $token=md5(time())
  3. ?>


Działanie funkcji time jest podobne (szczegóły znajdziesz na
PHP.NET), funkcja md5 tworzy, na podstawie algorytmu RSA, taki właśnie token.

Pozdr
DjKermit
Cytat(chaos_code @ 9.05.2007, 18:29:49 ) *
czy nie lepiej od początku napisać samemu?

Chyba nie bardzo bo co z przekazywaniem SID, załóżmy że ustawiasz ciacho tylko co jak user ma wyłączoną obsługę ciastek, pehap przekazuje wtedy SID praze formularze, linki i inne rzeczy z automatu, jesteś pewien że chcesz to pisać os zera??
chaos_code
To jest przekonywujący argument. smile.gif
Do każdego linka na stronce dodawać id sessji... ała...

Więc moje rozwiązanie jedynie do specyficznych projektów. Masz cooki, masz sesje. Nie to nie.
Coś mi mówiło, że to nie będzie takie proste...
Więc wracam do wgryzania się w session_set_save_handler.
Dzięki. smile.gif

Cytat(Void(Null) @ 9.05.2007, 23:52:15 ) *
Gdybyś zaś chciał utworzyć zmienną typu "token" (jak w phpMyAdmin) czyli ciąg różnych alfanumerycznych znaków możesz zrobić tak:

  1. <?php
  2. $token=md5(time())
  3. ?>


Dzięki, o takie coś dokładnie mi chodziło. smile.gif
Do tego jakiś random, żeby nawet dla użytkowników co chcą się zalogować w tym samym czasie różne ciągi generował i będzie ok.
nrm
sprawa jest prosta, nie mam przykładów pod ręką ale wiem gdzie możesz podpatrzeć dobre rozwiązania:

1. Kompleksowe rozwiązanie różnego typu sesji masz w cakePHP framework - zassaj, dogrzeb sie do pliku session, otwórz dokumentacje i pooglądaj. Swego czasu przerobiłem to na klase do swojego projektu.

2. Kilka wersji sesji masz w dodatkach do CodeIgnitera -> wejdz na strone głółną -> wiki -> szukaj: session. conajmniej 3 różne rozwiązania.

no i oczywiście nie wklejaj sida do urla, to nie średniowiecze ;D "nie masz cookie to spadaj na drzewo banany prostowac" biggrin.gif
chaos_code
Dzęki, przejrzę.

Jeszcze przemyślę, czy do mojego projektu będzie konieczne działanie w przypadku wyłączonych ciasteczek.
A jeśli nie, to zrobię po swojemu. smile.gif
Luke_Star
Ostatnio w Projektach PHP którego patronatem jest wortal PHP.PL pojaiweła sie zaawnasowana obsługa sesji różna od tego co oferują wbudowane funkcje. Nie pamietam nazwy autora ale wiem ze jest profesjonalistą a kod został nagrodzony wyróżnieniem smile.gif Wybaczcie za tą reklame biggrin.gif
chaos_code
Gratuluję smile.gif

Ale ten tego... ja bym chciał sam napisać. biggrin.gif
Choć nie powiem, jeśli dostanę zezwolenie, to może coś podpatrzę.

Już parę linijek kodu nabazgrałem, coś tam działa choć nie do końca. winksmiley.jpg

A przy okazji drobne pytanko.
Czy da się spod PHP zrobić takie coś, żeby dana funkcja (czy plik cały php) wywoływała się co jakiś czas, niezależnie od interakcji z użyszkodnikami?
Czy to już raczej o crona zahacza?
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.