Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zastąpienie sesji - czym najlepiej to zrobić ?
Forum PHP.pl > Forum > PHP
ederlezi
Witam,

moja znajomość PHP jest mocno ograniczona i nie chciałbym brnąć ślepo w niewłaściwe rozwiązanie. Mam parser XML , który działa i został napisany przez kogoś innego dość dawno temu. Ten parser składa się z kilkunastu plików , wywoływane są one jeden po drugim. Dane między plikami są trzymane w sesjach. Wszystko jest ok, dopóki wywołam ten parser z przeglądarki internetowej. Muszę go jednak zmienić. Będzie on wywoływany poleceniem GET bez mechanizmu utrzymania sesji.

Moje pytanie brzmi - jak najlepiej zamienić sesje na coś innego, żeby się najmniej napracować ? Mój pierwszy pomysł - przejrzeć wszystkie pliki i tam gdzie są zapisywane zmienne sesyjne , zapisywać zmienne do bazy danych. Tam gdzie są odczytywane zmienne sesyjne - zrobić odczyt z bazy danych. Problem się zaczyna, gdy sesje zawierają np tablice, bo wtedy trzeba by chyba serializować dane przed zapisem i potem odpowiednio deserializować przed odczytem. Jakie podejście zastosować, żeby zrobić to w miarę szybko ? Może istnieje inne - lepsze i szybsze rozwiązanie niż to, które ja wymyśliłem.

Pozdrawiam i dziękuję.
session
Nie da się jednoznacznie odwzorować mechanizmu sesji (przynajmniej w prosty sposób ) w PHP, ale można przeanalizować do czego tak naprawdę wykorzystywane są sesje, czy służą do identyfikacji użytkowników i przechowywaniu przypisanym im wartości, czy tylko i wyłącznie do utrzymywania informacji przekazywanych między skryptami. Innymi słowy czy kilka użytkowników może "jednocześnie" wykonać skrypt, oraz czy wartości zmiennych sesyjnych faktycznie są unikalne i wymagają przechowania aż do końca sesji. Jeśli zależy nam na identyfikacji usera i ewentualnym przechowaniu przypisanych mu informacji sprawdziłbym czy środowisko w którym uruchamiany jest skrypt (skoro nie jest nim przeglądarka) obsługuje cookies. Magazyn danych oparłbym na bazie tekstowej, a funkcje dotyczące sesji "zamieniłbym" odpowiednikami:

session_start();
- otwiera magazyn
- sprawdza czy istnieje określone COOKIE (które zawiera ID usera)
- jeśli nie generuje unikalny ID dla "sesji" i zapisuje w COOKIE
- tworzymy tablicę wielowymiarową której kluczem pierwszego elementu jest ID, a jego wartością tablica niższego rzędu, do której będziemy wrzucać zmienne sesji.
- jeśli w bazie istnieje podane ID wczytuje zmienne (o tym potem) lub "zeruje" je
- jeśli nie, dodaje nowy wpis do bazy stosując JSON encode na utworzoną tablicę
- zwraca ID (chyba, że stworzymy taką zmienną o zasięgu globalnym, wtedy może zwracać boola)

session_destroy();
- sprawdza czy istnieje COOKIE
- jeśli tak usuwa cały wpis dodany do bazy związany z ID (przegląda wszystkie wpisy i usuwa konkretny)
- usuwa COOKIE
- zamyka magazyn
- zwraca boola

$_SESSION[" "] =
- pobiera ID z COOKIE
- wczytuje cały wpis z bazy dotyczący ID
- JSON decode
- sprawdza czy istnieje element o podanej nazwie
- jeśli tak, zmienia jego wartość
- jeśli nie, dodaje element wewnątrz tablicy o kluczy takim jak nazwa zmiennej i określonej dla niej wartości
- JSON encode
- nadpisuje wpis

$_SESSION[" "];
- pobiera ID z COOKIE
- wczytuje cały wpis z bazy dotyczący ID
- JSON decode
- zwraca wartość dla danej nazwy zmiennej

Jeśli COOKIE nie jest obsługiwane można pokombinować ze zmiennymi globalnymi, lub jeśli skrypt będzie uruchamiany np. z konsoli można "symulować" COOKIE tworząc mały plik tekstowy o określonej nazwie zawierający ID.

W celu przyspieszenia wykonywania operacji w bazie można ID inkrementować w jakiś sposób i wykorzystać jeden z algorytmów szybkiego wyszukiwania. Dodatkowo taki skrypt przechowuje sesję do momentu wykonania session_destroy(), i nie znika przy "zamknięciu przeglądarki".

Tak bym to widział biggrin.gif , ale wszystko zależy od tego jak i do czego skrypt wykorzustuje sesje wink.gif
ederlezi
Cytat(session @ 17.11.2014, 13:20:26 ) *
Nie da się jednoznacznie odwzorować mechanizmu sesji (przynajmniej w prosty sposób ) w PHP, ale można przeanalizować do czego tak naprawdę wykorzystywane są sesje, czy służą do identyfikacji użytkowników i przechowywaniu przypisanym im wartości, czy tylko i wyłącznie do utrzymywania informacji przekazywanych między skryptami. Innymi słowy czy kilka użytkowników może "jednocześnie" wykonać skrypt, oraz czy wartości zmiennych sesyjnych faktycznie są unikalne i wymagają przechowania aż do końca sesji. Jeśli zależy nam na identyfikacji usera i ewentualnym przechowaniu przypisanych mu informacji sprawdziłbym czy środowisko w którym uruchamiany jest skrypt (skoro nie jest nim przeglądarka) obsługuje cookies. Magazyn danych oparłbym na bazie tekstowej...


Sesje służą tylko do zapamiętania informacji między skryptami, nie zależy nam na identyfikacji usera.
Dodatkowo mam pytanie - jaka korzyść będzie jeśli wykorzystam bazę opartą o pliki tekstowe vs powiedzmy MySQL ? Myślałem o tym, żeby przed rozpoczęciem skryptu tworzyć tymczasową tabelę, a pod koniec skryptu żeby ją usuwać.
Sephirus
A nie lepiej zostawić samej sesji i pobrać jedynie jej odpowiednie id?

Normalnie działa to tak, że sesja zapisuje w ciasteczku swoje ID, to ID idzie z przeglądarki do następnych skryptów i mają one dostęp do tej samej sesji ale przecież ID sesji można przekazywac manualnie smile.gif

Odpalając skypt PHP (ten - nazwijmy to - startujący) odpalamy go normalnie bez parametrów - zmieniłbym w nim to, że po utworzeniu sesji zapisuje on gdzieś sobie ID tej sesji.

Skrypt ten odpala inne skrypty - niech im zatem podaje w parametrze GET czy argumencie ID sesji którą utworzył a one niech startują sesję właśnie na tym ID...

Wszystko opiera się o użycie funkcji session_id, która to zwraca id sesji bądź je ustawia smile.gif
session
Cytat
Sesje służą tylko do zapamiętania informacji między skryptami, nie zależy nam na identyfikacji usera.


Tak też się spodziewałem, teraz problem sprowadza się jedynie do tworzenia bazy, zapisania informacji np. wykorzystując JSON (tak samo tworzysz tablicę, do której wrzucasz dane, tylko nie potrzebujesz już ID itd., JSON obsłuży też zmienne tablicowe o których pisałeś). Podmieniasz session-start na funkcjię otwierającą bazę, session-destroy na zamykającą i operujesz na danych.

Cytat
jaka korzyść będzie jeśli wykorzystam bazę opartą o pliki tekstowe vs powiedzmy MySQL


Moim zdaniem nie ma potrzeby wykorzystywać np. MySQL które oferuje wiele operacji, różnego rodzaju pola itd. tylko do przechowywania bliżej nieokreślonych stringów czyli w sumie jedna kolumna. Baza tekstowa wydaje mi się bardziej optymalna, może jest troche trudniejsza w obsłudze, bo trzeba pisać samemu wiele rzeczy, ale za to w MySQL musiałbyś przewidzieć jakiej długości będą stringi itd. chyba że nie masz tego wiele i nie interesuje Cie optymalizowanie to nic nie stoi na przeszkodzie użycia MySQL.

Czyli to co trzeba zrobić to utworzyć tablicę taką jaką jest $_SESSION; użyć JSON i zapisać do bazy. Bazę czyścić z każdym uruchomieniem głównego skryptu. A jeśli skrypty są ze sobą powiązane przez np. include nie potrzebujesz nawet bazy, a możesz użyć zmiennej globalnej.
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.