Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Znikanie zmiennej sesyjnej
jwaldek
post 12.12.2012, 10:39:57
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.12.2007

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


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.  


Ten post edytował jwaldek 12.12.2012, 10:55:43
Go to the top of the page
+Quote Post
jeremiash
post 12.12.2012, 11:16:43
Post #2





Grupa: Zarejestrowani
Postów: 94
Pomógł: 5
Dołączył: 6.11.2012

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


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?

Ten post edytował jeremiash 12.12.2012, 11:29:44
Go to the top of the page
+Quote Post
mortus
post 12.12.2012, 11:43:40
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


session_start() musi się znaleźć na początku skryptu. Test:
  1. if(!isset($_SESSION)) {
  2. echo 'stop';
  3. } else {
  4. echo 'run';
  5. }
Go to the top of the page
+Quote Post
jwaldek
post 12.12.2012, 11:55:34
Post #4





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.12.2007

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


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?

Ten post edytował jwaldek 12.12.2012, 11:57:26
Go to the top of the page
+Quote Post
jeremiash
post 12.12.2012, 12:00:52
Post #5





Grupa: Zarejestrowani
Postów: 94
Pomógł: 5
Dołączył: 6.11.2012

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


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

Ten post edytował jeremiash 12.12.2012, 12:02:54
Go to the top of the page
+Quote Post
jwaldek
post 12.12.2012, 12:12:09
Post #6





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.12.2007

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


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%)
Go to the top of the page
+Quote Post
jeremiash
post 12.12.2012, 12:15:06
Post #7





Grupa: Zarejestrowani
Postów: 94
Pomógł: 5
Dołączył: 6.11.2012

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


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ą

Ten post edytował jeremiash 12.12.2012, 12:15:26
Go to the top of the page
+Quote Post
jwaldek
post 12.12.2012, 12:30:22
Post #8





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.12.2007

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


Ok. będę to monitorował gdy tylko ponownie zauważę wystąpienie problemu.
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: 29.03.2024 - 13:04