Przechowywanie duzej ilosci danych w Sesji

0

Tworze dosyć duży projekt i bardzo duża ilość danych musi być dynamicznie pobierana z bazy MySQL aby na bieżąco dynamicznie sterować stroną. Nie będą to jednak zmiany codzienne, lecz powiedzmy co miesiąc i nie mają wpływu na działanie użytkownika. Aby nie pobierać tych danych co zmianę podstrony, chciałbym po pierwszym pobraniu umieścić je w SESJI, a potem pobierać prosto z niej aby nie obciążać bazy danych.

Czy będzie to optymalne rozwiązanie?
Powiedzmy że w sesji będzie 20 tablic po 40 wyników.

1

Jakiś czas temu nie w PHP, ale w ASP.NET robiłem jedną większa aplikację i tam w sesji trzymałem dość dużą ilość danych, podobnego rzędu i działało to bardzo sprawnie. Idea sesji w ASP.NET i w PHP jest ta sama, więc moim zdaniem warto tak zrobić, jeżeli chcesz odciążyć bazę danych.

Jednakże, dla wygody i łatwiejszego utrzymania, zamiast wprowadzać różne obiekty do sesji, lepiej utworzyć klasę obiektu np. o nazwie AppSession i w sesji przechowywać jeden obiekt tej klasy. Przy uruchamianiu skryptu korzystającego z sesji wykonasz działanie (mogę się mylić, bo nie mam dużego doświadczenia w PHP, ale myślę, że sens tego pseudokodu będzie zrozumiały):

class AppSession
{
    // Tu okreslasz, co ma być w sesji
}

function GetAppSession()
{
    if (isset($_SESSION["AppSession"]))
    {
        return = $_SESSION("AppSession");
    }
    else
    {
        $Temp = new AppSession();
        $_SESSION("AppSession") = $Temp;
        return $Temp;
    }
}

// W tym miejscu cała sesja jest w polu $AppSession_
$AppSession_ = GetAppSession();

W samej klasie AppSession dodajesz pola i metody tak samo, jak w każdej innej klasie, można to traktować, że obiekt $AppSession_ jest jedynym obiektem dostępnym cały czas w jednym i tym samym egzemplarzu.

2

Czy te wszystkie dane będą zawsze wykorzystywane na każdej podstronie?
Może jednak jakiś Ajax lub localstorage:
https://developer.mozilla.org/pl/docs/Web/API/Window/localStorage
Oszacuj ile całość może mieć bajtów, megabajtów? Bo jak to 100kb to więcej masz w dziejszych czas przy ładowaniu jakichś bibliotek js do obsługi fancy slidera.

0

@andrzejlisek: Jesli chodzi o rozwiązanie jak to wrzucac do sesji to mam juz swój pomysł aby działało to sprawnie. Chodziło mi jednak o samo działanie, czy SESJA nie obciąża bardziej serwera niż ciągłe pobieranie z MySQL, bo z tego co wiem SESJA jest przechowywana na serwerze w pliku.

0

@jurek1980: Nie wszystkie dane bedą pobierane na kazdej podstronie, ale tez nie wszystkie będą Od razu wpisywane do sesji. Czyli przykładowo mam na stronie 10 działów. Klient korzysta z jednego, interesującego go działu, więc jesli wejdzie w dział, to pobiera z mysql i wpisuje do sesji, pozniej podczas przegladania tego działu juz pobiera z sesji zamiast znowu z mysql co podstrone w dziale.
Co do localStorage, to dobrze rozumiem ze raz pobrane dane będą tam cały czas? Mysle ze to wlasnie w moim przypadku złe rozwiązanie, bo jesli na stronie zajdzie zmiana, to po ponownym właczeniu przegladarki, klient ma zaaktualizowane dane, a w localstorage miałby dalej stare?
Mogle w jakiś sposób sprawdzic wielkośc tej sesji? Nie będzie tam milionów danych. To tylko takie wspomagające dane do obsługi strony.

2

To czego szukasz to system cache a nie przechowywanie w sesji. Sesja jest tworzona osobno dla każdego użytkownika, mają więc np. 100 użytkowników online kopiujesz niepotrzebnie 100 razy TE SAME dane, to prosty sposób na zabicie serwera, a nie żadna optymalizacja.

1

Myślałem, że chodzi Ci o ilość transmitowanych danych. Tak to faktycznie jakiś system cache typu Redis.

0

@TomRZ: Dokładnie o to chodzi. Tylko tutaj najlepiej chyba było by cache przechowywane lokalnie u uzytkownika, mam racje?
@jurek1980: Redis wykorzysuje zapis w RAM zamiast na dysku, ale czy lokalnie czy na serwerze?

1

Na serwerze.
Sesja zresztą też jest trzymana na serwerze, a w ciasteczku sesyjnym masz tylko jej identyfikator.

Zobacz: https://www.rankwatch.com/blog/how-sessions-work-on-php/

2

Przechowywanie czegoś u użytkownika jest o tyle niebezpieczne, że on może tym manipulować, więc nie możesz na tym polegać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1