Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak dużą objętościowo zmienną można przechować w sesji?
Forum PHP.pl > Forum > PHP
skleps
Jak dużą objętościowo zmienną można przechować w sesji?
Chodzi mi o to, czy mogę zserializować obiekt i między stronami przepychać go via sesje?

Obiekt może parę czy paręset kB mieć więc przyjmijmy, że będzie miał 1MB - da się toto bez problemu przechować w sesji?
Prezi2907
Cytat(skleps @ 14.12.2011, 13:20:37 ) *
Jak dużą objętościowo zmienną można przechować w sesji?
Chodzi mi o to, czy mogę zserializować obiekt i między stronami przepychać go via sesje?

Obiekt może parę czy paręset kB mieć więc przyjmijmy, że będzie miał 1MB - da się toto bez problemu przechować w sesji?


Nie...

Sesje służą do przechowywania małych skrutowych informacji.

Powiedz mi co za rodzaj danych tam przechowujesz... Jakiś plik?

Łatwiej dane przenieść do pliku tekstowego lub do bazy z odpowiednimi parametrami gdzie parametry znowu zapisać do sesji. Zależy do czego wykorzystywany jest ten obiekt.
qrooel
Obiekt można przecież serializować do pliku i w sesji umieścić tylko adres tego pliku np.

Chociaż w Javie z tego co wiem to przetrzymuje się w sesji miliard rzeczy, które mogą zajmować nawet ponad 3 MB i nie ma z tym najmniejszego problemu.

http://stackoverflow.com/questions/4649907...f-a-php-session
Spawnm
Sesje przechowują dane w plikach.
Nie ma żadnych przeszkód w tym aby ktoś przechowywał zserializowane obiekty w sesjach.
Oczywiście pytanie czy nie spowoduje to komplikacji w działaniu aplikacji,
a kod nie zamieni się w spaghetti którego modyfikacja będzie trudna.
Prezi2907
Cytat(Spawnm @ 14.12.2011, 13:49:56 ) *
Sesje przechowują dane w plikach.
Nie ma żadnych przeszkód w tym aby ktoś przechowywał zserializowane obiekty w sesjach.
Oczywiście pytanie czy nie spowoduje to komplikacji w działaniu aplikacji,
a kod nie zamieni się w spaghetti którego modyfikacja będzie trudna.


Absurd... Podejście dobre dla jednego góra kilkunastu użytkowników.
Wyobraź sobie jak zmienna nie zostanie usunięta lub ktoś rozmyśli się po załadowaniu wszystkich danych i trzyma cały czas te dane w pamięci.

Jak wejdzie 100 takich userów to może jeszcze i nie problem ale jak będzie ich z 1000 - 2000 to już masz 2gb pamięci w plecy...

Do sesji nie wrzuca się żadnych dużych wartości. A jeżeli napisanie krótkiej funkcji obsługi pliku jest trudne dla Ciebie to lepiej nie zaczynaj pisać w PHP bo po co się męczyć...

Takie operacje są nie ekonomiczne i nie profesjonalne. Napisanie do bazy zapytania wyciągającego odpowiedni plik lub dane z możliwością odwołania się nawet po roku do nich to jeden select który będzie uwarunkowany odpowiednimi parametrami określającymi go...

A co do spaghetti... Hehe... Lepszego określenia nie widziałem smile.gif Klasy , funkcje i coś takiego jak "spaghetti" nie występuje. Wystarczy pisać w miarę estetycznie.

Cytat(qrooel @ 14.12.2011, 13:37:23 ) *
Obiekt można przecież serializować do pliku i w sesji umieścić tylko adres tego pliku np.

Chociaż w Javie z tego co wiem to przetrzymuje się w sesji miliard rzeczy, które mogą zajmować nawet ponad 3 MB i nie ma z tym najmniejszego problemu.

http://stackoverflow.com/questions/4649907...f-a-php-session


I jak wyżej. Nie ma sensu przeładowywać sessji. Lepiej napisać głupi skrypt do pliku i cała zabawa... przecież w bazie możesz trzymać te pliki. Po co zaśmiecać sesje.

Jeżeli to jakaś aplikacja z logowaniem - podpisujesz go do odpowiedniego usera lub dodatkowo do jakiegoś działu
Jeżeli nie - to po prostu przypisz do jakiś odpowiednich dat , kategorii, działów. Przecież to nie jest żadna super trudna operacja...
skleps
To rozwiązanie dla Panelu administracyjnego, którego będą używały max 3 osoby jednocześnie smile.gif

Chciałem po prostu przyspieszyć i zminimalizować orkę po bazie danych (bo do niej akurat odwołują się skrypty strony www dostępne dla normalnych internautów)
jak również nie odwoływać się do dysku.
Prezi2907
Cytat(skleps @ 14.12.2011, 14:49:35 ) *
To rozwiązanie dla Panelu administracyjnego, którego będą używały max 3 osoby jednocześnie smile.gif

Chciałem po prostu przyspieszyć i zminimalizować orkę po bazie danych (bo do niej akurat odwołują się skrypty strony www dostępne dla normalnych internautów)
jak również nie odwoływać się do dysku.



Sesje trzymane są na serwerze na dysku. Ale dla 3 osób to spokojnie rób tą serializację.
Ale ja mam złe doświadczenie z ludźmi i sesjami gdzie przeładowali tak sesje że serwer miał dosyć smile.gif Było to 10 osób które na maksa chciały sobie przyspieszyć pracę na 3-4 oknach i na każdym osobna sesja smile.gif

Ale to był pojedynczy przypadek.
skleps
Cytat(Prezi2907 @ 14.12.2011, 14:54:52 ) *
Sesje trzymane są na serwerze na dysku.


Wiem - ale odczytywac z sesji zmienna (jedno odwolanie do pliku), zeby odczytac nazwe pliku i pobrac plik z dysku (drugie odwolanie do dysku) to de factyo 2 odwolania do dysku smile.gif
A pobranie zmiennej z sesji to jedno odwolanie

Cytat(Prezi2907 @ 14.12.2011, 14:54:52 ) *
Ale ja mam złe doświadczenie z ludźmi i sesjami gdzie przeładowali tak sesje że serwer miał dosyć smile.gif Było to 10 osób które na maksa chciały sobie przyspieszyć pracę na 3-4 oknach i na każdym osobna sesja smile.gif


Akurat w tym przypadku nie ma szansy na to - pojedyncza osoba może "obrabiać" na raz tylko 1 rzecz smile.gif
nospor
Cytat
Chciałem po prostu przyspieszyć i zminimalizować orkę po bazie danych
Do takich rzeczy służy zazwyczaj cache a nie sesja

Cytat
to de factyo 2 odwolania do dysku
Bez przesady. Już nie wierzę, że piszesz tak optymalny i super wydajny skrypt, że jedno odwołanie do dysku więcej robi ci niesamowitą różnicę. A już szczególnie przy pracy "aż 3 userów".
skleps
Cytat(nospor @ 14.12.2011, 15:31:29 ) *
Już nie wierzę, że piszesz tak optymalny i super wydajny skrypt, że jedno odwołanie do dysku więcej robi ci niesamowitą różnicę. A już szczególnie przy pracy "aż 3 userów".



Nie, raczej lenistwo własne, dzięki któremu staram sobie uprościć i przyspieszyć pracę smile.gif
nospor
To po co wysuwasz argumenty, które z racji lenistwa i tak nie mają żadnego znaczenia? tongue.gif
Fifi209
Cytat(Prezi2907 @ 14.12.2011, 14:39:15 ) *
Wyobraź sobie jak zmienna nie zostanie usunięta lub ktoś rozmyśli się po załadowaniu wszystkich danych i trzyma cały czas te dane w pamięci.

Znajomość działania serwera apache leży. Mi się jednak wydawało, że ustawia się czas życia sesji i właśnie od automatycznego usuwania on jest.
Cytat(Prezi2907 @ 14.12.2011, 14:39:15 ) *
Jak wejdzie 100 takich userów to może jeszcze i nie problem ale jak będzie ich z 1000 - 2000 to już masz 2gb pamięci w plecy...

2gb? Trzeba było dokładnie przeczytać temat, w dyskusji rzucił liczbą 3 użytkowników a nie 1000 czy 2000.
skleps
Cytat(nospor @ 14.12.2011, 16:27:45 ) *
To po co wysuwasz argumenty, które z racji lenistwa i tak nie mają żadnego znaczenia? tongue.gif


A jak powiesz: "szklanka jest w połowie pełna" czy "szklanka jest w połowie pusta" ? smile.gif
Był szybki pomysł, szybka wątpliwość to i szybkie pytanie poszło na forum, no i przyszła szybka odpowiedź smile.gif


Odpowiedź na swoje pytanie uzyskałem, za co dziękuję odpowiadającym smile.gif

Cytat(Fifi209 @ 14.12.2011, 17:27:53 ) *
Znajomość działania serwera apache leży. Mi się jednak wydawało, że ustawia się czas życia sesji i właśnie od automatycznego usuwania on jest.


Widziałem już drobną pomyłkę w konfiguracji, gdzie serwer nie czyścił plików sesji (dokładnie zapisywał w jednym miejscu a chciał kasować z innego smile.gif

Cytat(Fifi209 @ 14.12.2011, 17:27:53 ) *
2gb? Trzeba było dokładnie przeczytać temat, w dyskusji rzucił liczbą 3 użytkowników a nie 1000 czy 2000.


Prezi2907 pisał o 2K userów, w momencie gdy nie napisałem ile osób będzie tego używało.
Fifi209
Cytat(skleps @ 14.12.2011, 19:14:18 ) *
Widziałem już drobną pomyłkę w konfiguracji, gdzie serwer nie czyścił plików sesji (dokładnie zapisywał w jednym miejscu a chciał kasować z innego smile.gif

Co ma błąd w konfiguracji do tego co ja napisałem o braku wiedzy?

Cytat(skleps @ 14.12.2011, 19:14:18 ) *
Prezi2907 pisał o 2K userów, w momencie gdy nie napisałem ile osób będzie tego używało.

Fakt, teraz zobaczyłem.
celbarowicz
Macanie sesji:
  1. <?php
  2. for($i=1;$i<=1090000;$i++){$x='w'.$i;
  3. $_SESSION[$x]=$x;
  4. }
  5. //echo $_SESSION[$x]=$x;
  6. echo strlen( $_SESSION[$x]);
  7. ?>

Zmiana wartości $i lubdługości $x powoduje przerwanie skryptu. Przy w/w skrypt działa do końca. Dla $i=1900000 -> error.
Czy to coś pokazuje?
Nie badałem wielkości zmiennej sesyjnej.
Lub to:
  1. <?php
  2. $x='';
  3. for($i=1;$i<=10900000;$i++){$x.='w';
  4.  
  5. }
  6. //echo $_SESSION['w']=$x;
  7. echo strlen( $_SESSION[$x]);
  8. ?>

Jak $i zwiększymy o 0 to wywala skrypt , należy ustawić settimelimit i badać dalej.




skleps
Cytat(Fifi209 @ 14.12.2011, 19:49:01 ) *
Co ma błąd w konfiguracji do tego co ja napisałem o braku wiedzy?


To była tylko dygresja, że nie należy na 100% wierzyć temu, że coś działa dokładnie tak jak powinno działać.
I zasada "ufaj, lecz sprawdzaj" jest przydatna smile.gif

Uriziel01
Jeżeli ktoś twierdzi że wielkość sesji nie ma znaczenia to najprawdopodobniej nie zna zasady jej działania. Jak wydajnie może działać serwer robiąc serialize'a i unserialize'a na ważących kilkanaście MB plikach, przy każdym zapytaniu do serwera.
Crozin
Zacznijmy od tego, że wszelkie pytania o "możliwości" sesji należy kierować w odniesieniu do konkretnej jej implementacji. Wcale nie jest powiedziane, że mamy tutaj do czynienia z domyślną, wbudowaną w PHP implementację.

Domyślny mechanizm musi każdorazowo korzystać z dysku, a operacje odczytu i zapisu na tym nośniku są stosunkowo powolne. W dodatku mowa tutaj o plikach tekstowych tekstowych, nie binarnych. Oczywiście nie będzie specjalnej różnicy pomiędzy 30 kilobajtowym plikiem, a 2 megabajtowym, ale im więcej porcji danych musisz zapisać czy odczytać tym bardziej to medium będzie dawało się we znaki.
Z 1 megabajtowymi plikami nie powinno być najmniejszych problemów.

Cytat
Jak wejdzie 100 takich userów to może jeszcze i nie problem ale jak będzie ich z 1000 - 2000 to już masz 2gb pamięci w plec y...
No i co w tym dziwnego, że 2000 użytkowników generuje 2 GiB tymczasowych danych? A przy takiej ilości odwiedzających, o ile nie zrypaliśmy konf. serwera, mamy niemal pewność, że wszystkie niepotrzebne dane zostaną usunięte w ciągu sekund.
Cytat
Do sesji nie wrzuca się żadnych dużych wartości. A jeżeli napisanie krótkiej funkcji obsługi pliku jest trudne dla Ciebie to lepiej nie zaczynaj pisać w PHP bo po co się męczyć...
A co za różnica czy dane będą składowane w pliku sesji czy swoim własnym pliku?

@nospor: Do takich rzeczy służy zazwyczaj cache a nie sesja A kto powiedział, że sesja nie może być wykorzystywana jako miejsce składowania danych? smile.gif
@Fifi209: A co do licha ma serwer Apache do czyszczenia danych zapisanych w przedawnionych sesjach?
nospor
Cytat
@nospor: Do takich rzeczy służy zazwyczaj cache a nie sesja A kto powiedział, że sesja nie może być wykorzystywana jako miejsce składowania danych?
Bo widzisz Crozin, bo to wszystko zależy. Jeśli użytkownik, chce z tych danych korzystać tylko i wyłącznie w jakiejś określonej akcji a nie za każdym razem gdy wejdzie w aplikację bez różnicy na jaką akcję, no to sorki, ale bardziej optymalnym rozwiązaniem będzie cache, który będzie ładowany tylko i wyłącznie dla tej konkretnej akcji. Sesja jak wiesz będzie ładowana za każdym razem i naprawdę nie ma większego sensu ładować w niej ciągle i ciągle bardzo dużej liczby danych, jeśli z tych danych korzystamy raz na jakiś czas.
Jeśli zaś te dane, są potrzebne przy każdym odpaleniu strony, niezależnie od akcji, to pal cie licho, może być i sesja wink.gif
skleps
Jeszcze chwila a chyba zostanie ogłoszony tu dżihad, chyba muszę wyjaśnić, bo zaczyna się dyskusja o wyższości Świąt Bożego Narodzenia nad Wielkanocą .

Dane w sesji będą raptem na jednej stronie, która będzie przeładowywana. To będzie tak jakby zrobić "fakturę":
User zakłada "dokument", następnie dodaje po jednej pozycji "towaru" i po każdym dodaniu towaru strona się przeładowywuje, żeby poprzeliczać "ceny" (wiem wiem, mogę ajaxa zaprząc).
Jak uzna że jest gotowe to kliknie "generuj dokument" i w tym momencie dane trafią do bazy już na stałe, więc usunie się dane z sesji.

W sumie to liczę że dane zajmą do 10kB, ale jak wiadomo jak trafi się zdolny user to przyjmuję na idiotę 1MB (ale nigdy nie powinno się to stać).
nospor
W tym wypadku sesja jest jak najbardziej ok.
Uriziel01
No to faktycznie ładnie polecieliśmy w spekulacje, dla 1000>x>10 KB obiektów nie ma żadnych przeciwskazań aby trzymać to w sesji (Chyba że chcesz obsługiwać tysiące REQ/s wink.gif ).
skleps
Cytat(Uriziel01 @ 15.12.2011, 10:14:46 ) *
(Chyba że chcesz obsługiwać tysiące REQ/s wink.gif ).


Max 3 userów na raz i każdy będzie w stanie zrobić max 1 req/s (byłbym w szoku gdyby dawali radę robić więcej niż 1 req/s smile.gif
Crozin
@nospor: Chciałem tylko przyczepić się do tego, że "cache" może występować w dosłownie tysiącu postaci. wink.gif

nospor
@Crozin hehe, a ja pod pojęciem cache rozumiem cache a nie sesja wink.gif
Parę postów wcześniej wyjaśniłem chyba drobną różnicę między sesją a cache. Mimo, iż jest to drobna różnica, jest ona bardzo ważna. I byłbym bardzo ostrożny w mieszanie sesji z pojęciem cache.
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.