Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Czas trwania sesji
radabus
post 18.08.2009, 13:07:16
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 2
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Witam

Szukałem na forum dość intensywnie, ale nie znalazłem takiego zagadnienia. Próbuję ustawić czas trwania sesji w taki sposób:

  1. ini_set('session.cookie_lifetime', XXXX);

Problem objawia się w ten sposób, że cookie jest ustawiane z danym czasem, a przy odświeżaniu strony czy też przechodzeniu na inne strony ten czas nie jest aktualizowany. Przykładowo ustawiam sobie na 20 sekund. Wywołuję stronę i kontroluję sesję za pomocą wyświetlenia session_id();

Przy pierwszym wywołaniu - pojawia się session_id danej sesji. Przy próbie odświeżania - zmienia się po 20 sekundach. Przy próbie przejścia na inną stronę po 10 sekundach, nie ustawia nowego czasu trwania sesji, tylko nadal leci "stary" licznik i po kolejnych 10 sekundach sesja wygasa, tworzony jest nowy identyfikator sesji.

W jaki sposób temu zapobiec? Jak ustawić, żeby przy każdym odświeżeniu strony czy przejściu na inną czas ważności sesji/cookie z session_id był ustawiany ponownie na ustaloną wartość?

Hm, jeśli mógłbym prosić o pomoc, odesłanie chociaż w przybliżeniu do konkretnej części manuala... Byłoby super, bo niestety sam nie potrafię sobie poradzić z tym problemem.

Przestawienie session.gc_maxlifetime = 1440 na inną wartość (w php.ini na 20 sekund przykładowo) i podmiana session.gc_probability = 100 - nic nie daje, sesja trwa i dłużej niż 20 sekund.

Prosiłbym bardzo o wskazówki, jak wykonać to, żeby sesja trwała określony czas, a za każdym odświeżeniem/wywołaniem strony ten czas był wydłużany. Przy założeniu, że korzystam z cookies do przetrzymywania session_id.
Go to the top of the page
+Quote Post
erix
post 18.08.2009, 13:21:54
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




No to dajesz wtedy setcookie z nazwą sesji + identyfikatorem za każdym razem. :]


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
radabus
post 18.08.2009, 13:36:35
Post #3





Grupa: Zarejestrowani
Postów: 19
Pomógł: 2
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Pytanie tylko mi się nasuwa jedno: jeśli używam session_start i setcookie jednocześnie - to czy one nie będą się ze sobą kłócić? Czy może jest jakaś zasada, które użyć jako pierwsze?

Oczywiście nie mówię na razie o buforowaniu, zakładam chwilowo, że będzie to prosty skrypt, który na samym początku ma:

  1. setcookie("cokolwiek", $jakaszmienna, time()+20); //tu sugerowałem się manualem, nie wiem czy dobrze robię ustawiając jakieś "abstrakcyjne" cookie

Czy może w cookie "nadpisać" PHPSESSID? I czy chcąc zakończyć sesję (tzw. "wylogowanie", przed minięciem czasu bezczynności) muszę potem usuwać cookie ustawiając je na nowo z ujemnym czasem?

Ten post edytował radabus 18.08.2009, 13:38:46
Go to the top of the page
+Quote Post
CyberDuck_
post 18.08.2009, 13:39:30
Post #4





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Przedewszystkim mylisz sesje z ciastkami.
To sa dwie rozne rzeczy, a wiec mozesz stosowac je
osobno jak i jednoczesnie.
Nie beda sie klocic.
Musisz pamietac tylko, ze obie zmienne, ciastka jak i sesje, musza
byc zawsze zainicjowane przed wyslaniem czegokolwiek na stronie.
Go to the top of the page
+Quote Post
radabus
post 18.08.2009, 13:50:30
Post #5





Grupa: Zarejestrowani
Postów: 19
Pomógł: 2
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Trochę pogmatwałem. Chodziło mi o to, że session_start(); wysyła automatycznie cookie, tak samo jakbym zrobił
  1. setcookie("PHPSESSID", $session_id());

Czy teraz zgodnie z tym, co napisał erix, będzie poprawny taki kod:
  1. setcookie("PHPSESSID", $session_id(), time()+20);

- bo w sumie tak mi wychodzi na logikę... I teraz za każdym odświeżeniem strony będzie to ciasteczko miało ważność odnowioną? Czy może trzeba jeszcze użyć session_set_cookie_params?
Go to the top of the page
+Quote Post
CyberDuck_
post 18.08.2009, 13:58:46
Post #6





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Nie.
session_start(); jedynie fizycznie na serwerze
otwiera albo odczytuje specjalny folder potrzebny do
przechowywania zmiennych tam zawartych. Dokladnie
to sa pliki o nazwach zmiennych i zawartoscia tych
zmiennych, dla kazdego uzytkownika przebywajacego na stronie.
Zapisywac i odczytywac zmienne z sesji mozna w
dowolnym momencie strony $_SESSION['nazwa'] = 'cos'; ,
echo $_SESSION['nazwa']; .
Nic nie jest przesylane wraz z ta instrukcja.

Z ciastkami jest inaczej. Zmienne z ciastek sa przesylane
wraz z naglowkiem strony i dlatego jest wymog zeby je zapisac
lub odczytac przed wyslaniem czegokolwiek na stronie.
Jak juz wykonasz chociaz jedno echo lub jakis inny rozkaz
wyswietlajacy cos na stronie to juz po zabawie. Serwer
zglosi natychmiast w ostatnim wypadku odrazu blad cachelimiter.
Zywotnosc ciastek zapisujesz wraz ze zmienna w setcookie i tak
na prawde to przegladarka decyduje kiedy ja skasowac lub pozostawic.
Jesli dodasz do ciastka 20 sekund to za dwadziescia sekund po wejsciu
na dowolna strone komputer przejdrzy katalog z ciastkami i jesli ktorych
czas jest przedawniony to zmienna zostaje skasowana.
Go to the top of the page
+Quote Post
radabus
post 18.08.2009, 14:58:24
Post #7





Grupa: Zarejestrowani
Postów: 19
Pomógł: 2
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Przepraszam, ale trochę namieszałeś. Z tego, co ja rozumiem, to kiedy robię tak:

To automatycznie jest wysyłane do przeglądarki ciasteczko - jego nazwa to "PHPSESSID", zawartość to session_id (czyli przykładowo c7b33b24c2d13ef2b13167f467bfd9f1), a ważność to 20 sekund (czyli przykładowo "Wygasa" 18 sierpnia 2009 15:39:12).

Tylko że problem jest w tym, że nie jest ono odnawiane przy odświeżeniu strony. Natomiast jeśli chcę wysłać ciasteczko (już po wywołaniu session_start();) za pomocą:
  1. setcookie("PHPSESSID", $session_id(), time()+20);

To dostaję błąd Fatal error: Function name must be a string in [path] on line [x]


Poprawka, usunąłem nawiasy, żeby uniknąć błędu. Wygląda to tak:
  1. setcookie("PHPSESSID", $session_id, time()+20);

Tak przynajmniej zrozumiałem, że należy to zrobić. Ale problemu nie rozwiązałem w ten sposób - nadal przy odświeżaniu strony czas życia ciasteczka nie jest przedłużany o kolejne 20 sekund, tylko wygasa... I potem ustawiana jest nowa sesja.


Zgodnie z tym, co napisał erix powinno być dobrze... Dlaczego więc tak nie jest i czas ważności ciasteczka przy odświeżaniu danej strony nie jest aktualizowany?

Ten post edytował radabus 18.08.2009, 14:56:56
Go to the top of the page
+Quote Post
erix
post 18.08.2009, 15:19:14
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Nie.
session_start(); jedynie fizycznie na serwerze
otwiera albo odczytuje specjalny folder potrzebny do
przechowywania zmiennych tam zawartych. Dokladnie
to sa pliki o nazwach zmiennych i zawartoscia tych
zmiennych, dla kazdego uzytkownika przebywajacego na stronie.
Zapisywac i odczytywac zmienne z sesji mozna w
dowolnym momencie strony $_SESSION['nazwa'] = 'cos'; ,
echo $_SESSION['nazwa']; .
Nic nie jest przesylane wraz z ta instrukcja.

Najpierw poczytaj, potem się wypowiadaj. session_start wysyła też ciasteczko sesyjne, jeśli nie jest ono obecne, ale go nie przedłuża. Kolejny nabijacz postów tylko dla testu?

Cytat
Tak przynajmniej zrozumiałem, że należy to zrobić. Ale problemu nie rozwiązałem w ten sposób - nadal przy odświeżaniu strony czas życia ciasteczka nie jest przedłużany o kolejne 20 sekund, tylko wygasa... I potem ustawiana jest nowa sesja.

Ciekawe, skąd tę zmienną bierzesz...

Czasem wystarczy tylko komentarze do funkcji przejrzeć, nie rozumiem dlaczego nikt tego nie robi...

http://pl2.php.net/manual/en/function.sess...arams.php#78930


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
radabus
post 18.08.2009, 16:47:41
Post #9





Grupa: Zarejestrowani
Postów: 19
Pomógł: 2
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


Dzięki erix za nakierowanie, nie przyszło mi do głowy, żeby czytać te komentarze. Zawsze zostaje nauczka na przyszłość winksmiley.jpg
W każdym razie, trochę sobie zmodyfikowałem przykład i działa:

  1. function sessionStart($time, $ses) {
  2. session_name($ses);
  3. if (isset($_COOKIE[$ses]))
  4. setcookie($ses, $_COOKIE[$ses], time() + $time, "/");
  5. }
  6. sessionStart(20, nazwasesji);

Jak rozumiem, można by go po prostu okroić do:

  1. setcookie(session_name(), session_id(), time() + 20, "/");

i też będzie działać. Przynajmniej mi działa i odświeża czas ważności ciasteczka przy każdym przeładowaniu strony. Trochę nie rozumiem zatem, dlaczego autor komentarza wstawia tam warunek:

  1. if (isset($_COOKIE[$ses]))

Skoro "krótszy" przykład działa niezależnie od tego, czy cookie jest ustawione, czy nie - po prostu je nadpisuje, aktualizując czas ważności ciasteczka.

Ten post edytował radabus 18.08.2009, 16:50:03
Go to the top of the page
+Quote Post
CyberDuck_
post 18.08.2009, 18:48:16
Post #10





Grupa: Zarejestrowani
Postów: 135
Pomógł: 15
Dołączył: 17.08.2009

Ostrzeżenie: (0%)
-----


No racja ... napisalem tak dla uproszczenia zeby bylo
wiadomo o co chodzi. Roznica polega na tym ze ciastko jest
zapisywane na dysku uzytkownika, a sesja na dysku serwera.
I propos nie musze sobie nabijac postow bo mnie to nie jest
do niczego potrzebne.

Ten post edytował CyberDuck_ 18.08.2009, 18:48:57
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2025 - 08:05