Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Znikanie zmiennej sesyjnej
Forum PHP.pl > Forum > PHP
jwaldek
Mam pewien problem ze zmienną sesyjną - chodzi o token który trzymam sobie w sesji
Bywa, że znika w zupełnie przypadkowy sposób, po prostu nagle zmienna sesyjna znika mimo, że nigdzie w kodzie nie ma funkcji która by cokolwiek usuwała z sesji

Skrypt wygląda mniej więcej tak jak poniżej, teoretycznie raz wygenerowana zmienna o nazwie "token" nie powinna znikać przez cały czas działania skryptu a jednka znika (i zostaje jej przypisana nowa losowa wartośc co powoduje błędy) i to w sposób przypadkowy (1 raz na 20-50 przeładowań skryptu co kilka-kilkanaście minut). Co może być przyczyną tego problemu?

  1.  
  2. //tak ustawiam sobie konfigurację sesji
  3. ini_set("session.gc_divisor",100);
  4. ini_set("session.gc_probability",1);
  5. ini_set("session.cookie_path","/");
  6. ini_set("session.cookie_lifetime",10800);
  7. ini_set("session.gc_maxlifetime",10800);
  8. ini_set("session.cookie_httponly",1);
  9. ini_set("session.use_only_cookies",1);
  10. ini_set('session.use_trans_sid',0);
  11.  
  12. if(!isset($_SESSION)){
  13. }
  14.  
  15. //generuje unikalny token, powinien byc niezmienny podczas całej sesji użytkownika
  16. if(!empty($_SESSION['token'])){
  17. $token=$_SESSION['token'];
  18. } else {
  19. $token="wartość losowa";
  20. }
  21.  
  22. //zapisuje token w sesji
  23. $_SESSION['token']=$token;
  24.  
  25. //dalej znajduje się pewien warunek który sprawdza, czy token w sesji jest niezmieniony od pierwszego uruchomienia skryptu
  26.  
jeremiash
a sesja Ci nie ginie w jakimś pliku? Nie ma sytuacji, że zapomniałeś na początku pliku dodać session_start() questionmark.gif
po co właściwie Ci

  1. if(!isset($_SESSION)){
  2. }


wystarczy



sprawdziłeś na pliku sesji co się dokładnie dzieje? Znika TYLKO ta zmienna sesyjna?
mortus
session_start() musi się znaleźć na początku skryptu. Test:
  1. if(!isset($_SESSION)) {
  2. echo 'stop';
  3. } else {
  4. echo 'run';
  5. }
jwaldek
session_start() jest na początku skryptu - przykład powyżej to częśc większego systemu, jeden plik, który inicjalizuje podstawowe rzeczy i nie ma możliwości , żeby to nie bylo załadowane (wszystko działa poprzez index.php, prosty mvc )
innych zmiennych sesyjnych nie ma, poza tym trudno mi wychwycić ten monent/przypadek, gdy zmienna znika z sesji. w dalszej części skryptu jest formularz który wysła pewne dane i po prostu np raz na godzine po wysłaniu danych z tego formularza zmienna sesyjna znika - podejrzewam, że to serwer czyści wygasłe sesje ale nie wiem czemu ta moja sesja jest uznawana za wygasłą?
Specjalnie podałem też ustawienia ini_set jakich używam, może jedno z nich jest niewłaściwe? Czy np ini_set("session.gc_maxlifetime",10800); ini_set("session.cookie_lifetime",10800); powoduje, że sesja jest usuwana od czasu pierwszego użycia sesji czy od czasu ostatniego zapisu do tablicy sesyjnej?
jeremiash
przecież ma na początku (tak myślę) , tylko niech wywali
  1. if(!isset($_SESSION)){ }


Mortus, to nie kwastia nagłówków.

ini_set("session.cookie_lifetime",10800);
ini_set("session.gc_maxlifetime",10800);

no to dokładnie zobacz do czego są te inicjalizacje smile.gif

Zawsze możesz zrobić to ręcznie, he he biggrin.gif

  1. if(isset($_SESSION['Akcja'])){
  2. $AktualnyTime= time();
  3. if((int)$_SESSION['Akcja']+ 1440 < $AktualnyTime ){
  4. $numer=$_SESSION['numer'];
  5. // session_destroy();
  6. unlink( ini_get('session.save_path') . 'sess_' . $numer );
  7. $numer=null;
  8. header('Location: xxx');
  9. die();
  10. }else{
  11. $_SESSION['Akcja']= $AktualnyTime;
  12.  
  13. $AktualnyTime=null;
  14. }


tylko utwórz S_SESSION['Akcja'] przy tworzeniu sesji smile.gif
jwaldek
Na razie wywalę ten warunek IF()

A session.gc_maxlifetime zwykle i tak ma domyślnie wartość 1440 więc podwyższając jego czas powinno skuktować tym, że w moim przypadku przedawnione zmienne sesyjne są kasowane po 3 godzinach, poza tym wykonując zapis do sesji przy każdym wykonaniu skryptu wydawało mi się, że nie ma możliwości aby zmienne sesyjne zostały wyczyszczone przez serwer (w moim przypadku dochodzi jeszcze prawdopodobieństwo czyszczenia na poziomie 1%)
jeremiash
sprawdź proszę plik swojej sesji kiedy Ci go wywali. sess_ID ... zobacz czy wywala tylko tę zmienną sesyjną, czy czyści całą sesję (0KB) , czy ją usuwa... to nam powie czy faktycznie niszczy całą sesję (i potem tylko będziemy szukali powodu) , czy też wywala jedną zmienną sesyjną
jwaldek
Ok. będę to monitorował gdy tylko ponownie zauważę wystąpienie problemu.
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.