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.

4

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

0

Czyli Redis wydaje się być dobrym rozwiązaniem. Raz pobrane dane z MySQL do Redisa, kolejnym razem cały czas podawane są z niego do każdego klienta.
Musze się jeszcze tylko dowiedzieć co jeśli dane MySQL się zmienią. w zupełności wystarczył by mi reset manualny ponieważ te dane będą zmieniane tylko przez administratora.

0

Mam jeszcze jedno pytanko co do Redisa. Zainstalowałem i wszystko pięknie działa, zaraz zacznę korzystać i przepisze kod, lecz zanim zaczne.

  1. Czy za każdym razem kiedy chce zapisać/odebrać dane, muszę się z nim łączyć? I czy trzeba jakoś zamykać połączenie?
  2. Jeśli będą w nim dane ogólnodostępne, czy konieczne jest dołożenie hasła? czy można zostawić jak w standardzie bez?
0

Jest pełno gotowych systemów cache, chociażby mój, trochę starsza wersja, nowej, lepszej jeszcze na githuba nie wgrałem, ale możesz skorzystać:

https://github.com/tztztztz/php-no-slam-cache

Możesz przechowywać w plikach / bazie / memcached, w nowej wersji jest jeszcze mongo i jest bardziej elastyczna, ale ta stara też działa.

Tyle tylko, że musisz wiedzieć jak się używa callbacków, bo na tym się cały mechanizm opiera.

Jak Ci mój system nie pasuje, to są inne wpisz w google np.: php cache system

0

@TomRZ: Czy twoje Cache jest kompatybilne z Ajax? z Redisem mam opoznienie 5 sekund jeśli łacze sie z PHP przez AJAX.

//Edit: Jednak to nie problem z Ajaxem, ale każde stworzenie obiektu Redis trwa około sekunde. Musiałbym na jednym połączeniu wszystko wyczytać i przypisać do zmiennych. Troche bez sensu. Nie wiem czy to problem konfiguracji, czy to że postawione obecnie na windows. Musze szukać przyczyny.

1

Sorry ale musisz się może najpierw wyraźnie nauczyć rozróżniać frontend (wszystko po stronie przeglądarki) od backend (wszystko po stronie serwera).

AJAX to po prostu wywołanie czego w backend ze strony frontend, tutaj nie potrzeba żadnej kompatybilności - to jest podobnie jakbyś wpisał adres w URL w okno przeglądarki i wywołał stronę.

Poczytaj sobie:

https://pl.wikipedia.org/wiki/AJAX

Edit: przy czym AJAX ma też minusy, trzeba wiedzieć kiedy stosowanie tego ma sens, a kiedy nie trzeba.

0

Juz wszystko działa jak nalezy. ładowanie strony około 200ms więc jest ok.

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