Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak przechowywać podręczne dane?
Forum PHP.pl > Forum > PHP
golab
Mam jeszcze jedno pytanko, do mądrzejszych ode mnie smile.gif

Otóż mam sobie portal, użytkownik loguje się.
Przechodząc ze strony do strony cały czas potrzebne są pewne stałe informacje (nazwy innych użytkowników z jego obszaru, id itp.). Każdy użytkownik ma zbiór innych stałych użytkowników, którzy mu się wyświetlają.

Tak więc za każdym razem, gdy użytkownik przechodzi z strony na stronę, wysyłam identyczne zapytania do MySQL.

Czy da się te informacje przechowywać w jakiejś pamięci podręcznej?

Widzę następujące możliwości. Proszę o komentarz, co powinienem wybrać:

1) zapisywać informacje w pliku tekstowym na serwerze, np. "tmp_{$user_id}.php", odświeżanym co rozpoczęcie nowej sesji.
2) przesyłać te informacje za pomocą $_COOKIES
3) przesyłać te informacje za pomocą $_SESSION
4) czy są jeszcze jakieś inne sposoby?

Jak Wy rozwiązujecie takie problemy najczęściej?


Wydaje mi się najlepsza opcja 1).


Pytanie drugie:
jak działa $_SESSION? Jeżeli zapiszę tam zmienną, ona w zaszyfrowanej postaci przesyłana jest na komputer użytkownika, czy cały czas znajduje się na serwerze?
Jeżeli zapiszę sobie np. 100 kb danych w $_SESSION to za każdym razem te informacje przesyłane są pomiędzy użytkownikiem a serwerem?


Pytanie trzecie:
czy jeżeli wybiorę opcje 2), to czy ktoś fizycznie jest w stanie zmienić pliki cookies na swoim komputerze tak, aby je spreparować i wyświetlać błędne/shackowane informacje?
Ghost_78
pyt 1) Ja bym to chowal w sesji ($_SESSION) najlatwiej i najszybciej
pyt 2) pliki sessji zapisywane sa na serwerze. miedzy uzytkownikiem a serwerem jest przesylany zawsze tylko i wylacznie identyfikator tej sesji, wiec niezaleznie czy bedziesz mial w sesji 100kB czy 100MB transfer miedzy maszynami sie nie zmieni.
pyt 3) tak - ciastko mozna zmienic i to w bardzo prosty sposob. poza tym to wlasnie w tym przypadku potrzebny jest transfer miedzy klientem a serverem.
golab
właśnie o taką odpowiedź mi chodziło smile.gif
Dzięki smile.gif
pedro84
Jedno magiczne słowo: cache. Skoro przechowujesz takie dane w bazie danych, to dlaczego nie chcesz keszować tych wyników? W b. ładny sposób możesz je przechowywać za pomocą Redisa, APC czy memcache.

Możesz sobie ustawić czas życia, etc. A jak wygaśnie Ci sesja, to tych danych już nie masz.

Cytat(Ghost_78 @ 21.10.2013, 08:23:17 ) *
pyt 2) pliki sessji zapisywane sa na serwerze. miedzy uzytkownikiem a serwerem jest przesylany zawsze tylko i wylacznie identyfikator tej sesji, wiec niezaleznie

Bzdura, dane sesyjne są ładowane do pamięci.
Ghost_78
Cytat
Bzdura, dane sesyjne są ładowane do pamięci.


http://pl.wikibooks.org/wiki/PHP/Sesje

Cytat
Działanie sesji w PHP jest bardzo proste. W momencie pierwszego trafienia na stronę interpreter tworzy specjalny, losowy oraz unikalny identyfikator przesyłany między żądaniami za pomocą ciastek lub parametru PHPSESSID doklejanego automatycznie do adresów URL. Na jego podstawie odczytywany jest później odpowiedni plik z danymi sesji zapisany gdzieś na serwerze. Pod koniec przetwarzania żądania wszystkie wprowadzone przez skrypt zmiany są z powrotem zapisywane do wspomnianego pliku tak, aby były widoczne przy wejściu na kolejną podstronę. I tak to się toczy.


Zanim napiszesz "bzdura" upewnij sie czy masz racje.

Jezeli skonfigurujesz inaczej server, to dane sesji moga byc przechowywane w innym miejsu np w bazie. Byc moze, mozna skonfigurowac apacha zeby przechowywal dane sesji w pamieci - ale nie widze sensu dla takiego rozwiazania.
pedro84
No właśnie sam cytujesz fragment, który pokazuje, że Twoja teoria jest bzdurą (pomijam fakt, że trochę zły fragment Twojego posta zacytowałem, bo mi chodziło o sens Twojej porady w szczególności biorąc pod uwagę rozmiar 100 MB i mogłem od razu rozwinąć). Przyjmujemy, że dane sesyjne są przechowywane w plikach. Tak, dane są zapisywane domyślnie na dysku. Tak, pomiędzy klientem a serwerem (po kiego przez "v"?) jest przesyłany tylko identyfikator sesji. Sorry, mogłem rozwinąć od razu. W teorii, oboje mamy racje i oboje się mylimy wink.gif Ale, zapomniałeś o ważnej rzeczy i tego dotyczył mój post. O pamięci (bo dane sesyjne, nawet przechowywane w plikach są ładowane do pamięci o czym niżej).

W momencie startu sesji za pomocą session_start() bądź też startu automatycznego sesji (jeśli ustawione w php.ini) php czyta plik danej sesji. Zacytuję Twój cytat:
Cytat
Na jego podstawie odczytywany jest później odpowiedni plik z danymi sesji zapisany gdzieś na serwerze. Pod koniec przetwarzania żądania wszystkie wprowadzone przez skrypt zmiany są z powrotem zapisywane do wspomnianego pliku tak, aby były widoczne przy wejściu na kolejną podstronę.

Dane te są ładowane przez PHP do pamięci (a myślisz, że PHP "czyta" ten plik siłą woli?) Dlatego też, sesja nie powinna być "duża". Wyobraź sobie te rzeczone 100 MB. Dla jednego usera. "Zaczytane" z pliku do pamięci. Najpewniej będzie to więcej niż ilość pamięci, jaką skrypt PHP może skonsumować. Ale nawet jeśli nie, to co w przypadku 10 userów? Mamy 1000 MB. 100 userów? 10000 MB. O to mi chodziło.

Do przechowywania takich danych służy cache, a nie sesja.

Nawet na forum o tym dyskusja była:
http://forum.php.pl/index.php?showtopic=174946
http://forum.php.pl/index.php?showtopic=189498
http://forum.php.pl/index.php?showtopic=79563

i na SO:
http://stackoverflow.com/questions/4649907...f-a-php-session
http://stackoverflow.com/questions/4274955...ssion-variables
Ghost_78
O masakra - i trafil sie czepliwy hater :/.

Cytat
serwerem (po kiego przez "v"?)

z przyzwyczajenia

Cytat
Wyobraź sobie te rzeczone 100 MB. Dla jednego usera. "Zaczytane" ... blah blah blah...

Podalem to tylko jako przyklad dla argumentu ze transfer pomiedzy klientem i serwerem bedzie taki sam w obu przypadkach. Bo takie bylo pytanie autora:

Cytat
golab:
Jeżeli zapiszę sobie np. 100 kb danych w $_SESSION to za każdym razem te informacje przesyłane są pomiędzy użytkownikiem a serwerem?


Nie rozumiem po co ta ironia:
Cytat
(a myślisz, że PHP "czyta" ten plik siłą woli?)

oczywiste jest to ze dane te sa ladowane do pamieci na czas obslugi sesji, tak samo jak wiele innych rzeczy, musza sie one znalesc w pamieci jak operujesz na nich.

Cytat
Do przechowywania takich danych służy cache, a nie sesja.

Autor nie pisal o kolosalnych ilosciach danych. Z twoich postow mozna wywnioskowac ze sesja to diabel w owczej skorze i trzeba sie go wystrzegac a wlasnie do takich rzeczy o jakie chodzilo autorowi jest przeznaczona sesja. Ale jak sadze chciales sie pochwalic znajomoscia takich wielkich slow jak cache, APC itp. Gratulujemy!

Nota bene, widziales kiedys sesje z SF2 ? Chyba bys sie pochlastal widzac ilosc danych zapisanych w niej.

Sadze ze temat mozna zamknac bo robi sie jalowy i bezprzedmiotowy.
pedro84
Cytat(Ghost_78 @ 23.10.2013, 22:43:41 ) *
O masakra - i trafil sie czepliwy hater :/.

Nie hejter, tylko piszesz bzdury.

Cytat(Ghost_78 @ 23.10.2013, 22:43:41 ) *
Autor nie pisal o kolosalnych ilosciach danych.

No, autor nie pisał, ale Ty pisałeś o bezproblemowym przechowywaniu nawet 100 MB danych w sesji co jest bzdurą, przyznasz. Pomijając już nawet to, że autor pytał o transfer, nie powinieneś takich nierealnych rzeczy pisać, albo przynajmniej nadmienić. Po co? Po to właśnie, żeby ktoś Ci nie wypomniał pisania bzdur. Poza tym, to o co pytał autor to właśnie cache, a nie sesja. No bo jak będzie miał dużą kolekcję danych to wszystko szlag trafi.

Cytat(Ghost_78 @ 23.10.2013, 22:43:41 ) *
Z twoich postow mozna wywnioskowac ze sesja to diabel w owczej skorze i trzeba sie go wystrzegac a wlasnie do takich rzeczy o jakie chodzilo autorowi jest przeznaczona sesja.

To już jest Twoja swawolna interpretacja.

Cytat(Ghost_78 @ 23.10.2013, 22:43:41 ) *
Ale jak sadze chciales sie pochwalic znajomoscia takich wielkich slow jak cache, APC itp. Gratulujemy!

Tak, zapewne. Argumentów brakuje?

Cytat(Ghost_78 @ 23.10.2013, 22:43:41 ) *
Nota bene, widziales kiedys sesje z SF2 ? Chyba bys sie pochlastal widzac ilosc danych zapisanych w niej.

A widziałeś, żeby SF przechowywał w keszu kolekcje pochodzące z bazy dancyh? Nie, bo trzyma je... w keszu.

Widzę, że Kolega ma problemy z krytyką, spoko, kiedyś Ci przejdzie wink.gif
com
Ghost_78 z całym szacunkiem ale pedro84 ma rację, zacznijmy od faktu:
Cytat
Otóż mam sobie portal, użytkownik loguje się.


Więc na pewno ma to działać szybko, optymalnie itd, dlatego to co napisał pedro84 ma jak najbardziej sens , bo po pierwsze przyspieszymy działanie, a po drugie nie robimy sobie syfu z sesji, bo ona wcale do tego nie służy aby tam większe dane przechowywać... Powiadasz sesje w SF2, po pierwsze nijak się to ma do tematu bo autor operuje na czystym php, a nie frameworkach, a po drugie Symfony zaadaptowało obsługę klasy sesji w swój własny sposób, który z $_SESSION to ma chyba tylko wspólną nazwę SESSION wink.gif
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.