2011-07-01 19 views
7

Mam problem z obsługą sesji w PHP (wersja 5.2.10). Używam poniższych funkcji do logowania, wylogowywania i sprawdzania poprawności.Błąd podczas niszczenia sesji w PHP

 
login() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    session_regenerate_id(true); 
    $_SESSION['user_id'] 
} 

validate_session() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    if (isset($_SESSION['user_id']) === FALSE) { 
     session_destroy(); 
     logout(); 
     header("Location: login_page"); 
    } 
} 

logout() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    $_SESSION = array(); 
    setcookie(session_name(), '', time() - 3600, '/'); 
    session_destroy(); 
} 

Każda strona najpierw wywołuje funkcję validate_session(). Jeśli sesja jest nieprawidłowa, przekierowuje na stronę logowania. Funkcja login() służy do tworzenia sesji dla użytkownika. Gdy użytkownik klika wylogowanie, wywoływana jest funkcja wylogowania() w celu zniszczenia sesji.

Problemem jest: losowo funkcja logout() generuje ostrzeżenie:
Warning: session_destroy(): zniszczenie obiektu Session powiodło

otrzymuję ostrzeżenie to bardzo rzadko. Podobnie jak w przypadku 20-30 połączeń do wylogowania, otrzymuję go jednorazowo. jakieś pomysły?

Pracuję na komputerze z Windows XP.

Aktualizacja: sesje są przechowywane w systemie plików.
Ścieżka: C: \ WINDOWS \ Temp

+1

Wydaje się to już dawno zaakceptowaniu żadnej odpowiedzi na StackOverflow .. –

+1

Tak! Nie byłem bardzo aktywny w stackoverflow. A w niektórych przypadkach nie mam jeszcze satysfakcjonującej odpowiedzi. – Varun

+0

Cześć Varun, czy możesz wyjaśnić, dlaczego w tym porównaniu podróż jest równa? Zwykle, jeśli (! Isset()) byłby wystarczający, wiem, że jest on bardziej ironiczny, ale isset() powinien tylko zwracać wartość boolean, czy naprawdę musisz potwierdzić jej typ? Prawdopodobnie nie jest to prawdopodobne, ale może czasami powraca, kiedy nie powinno? – picus

Odpowiedz

0

W jaki sposób przechowujesz swoje sesje? Jeśli jest oparty na pliku, może to być błąd przekroczenia czasu lub uprawnień?

Zastanawiam się również, czy generator regeneracji powoduje, że funkcja destroy szuka sesji, która już nie istnieje. Czy próbowałeś ustawić ten argument logiczny na false w funkcji regeneracji?

Mamy ten problem w aplikacji CakePHP, ale poprawiliśmy go, poruszając się ustawieniami Cake.

+0

sesja są przechowywane w systemie plików. Próbowałem również tego, co sugerowałeś, ale wciąż otrzymywałem ten błąd. Jak już wspomniałem, błąd występuje bardzo rzadko (czasami raz w ciągu dnia), bardzo trudno jest mi dokonać pewnych zmian, a następnie sprawdzić, czy rozwiązał problem. – Varun

+0

Kolejne pytanie, czy użytkownik rzeczywiście wylogował się po wyświetleniu ostrzeżenia? Albo, co ważniejsze, oprócz ostrzeżenia, wszystko inne funkcjonuje? Jeśli tak, możesz rozważyć pominięcie ostrzeżenia, dopóki nie zostanie to określone - to znaczy, jeśli jest to środowisko produkcyjne. – picus

0

Znaleziono something, które mogą być przydatne w tym temacie. Podstawowe problemy to:

  1. czy sesja jest ważna na początku - co jest wartością zwracaną z session_start()?
  2. Czy pliki sesji istnieją w pliku PHP.ini session.save_path i mogą zostać usunięte.

Podejrzewam, że w twoim przypadku jest to pierwszy. Nie pamiętam gdzie, ale myślę, że widziałem przypadek, w którym sesja unieważnia się, a następnie próbował z jakiegoś powodu powtórzyć proces.

2

Czy logout() jest wywoływana w innym miejscu niż w validate_session()? Jeśli nie, to problem może być wezwanie do session_destroy() przed wylogowaniem()

Można spróbować to:

validate_session() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    if (!isset($_SESSION['user_id'])) { 
     logout(); 
     header("Location: login_page"); 
    } 
} 

logout() 
{ 
    $_SESSION = array(); 
    setcookie(session_name(), '', time() - 3600, '/'); 
    session_destroy(); 
} 
+0

To jest również moje preferowane rozwiązanie, dodanie funkcji session_destroy do funkcji wylogowania zamiast funkcji validate_session() ma sens logiczny. Jedną z zalet tego rozwiązania jest zapobieganie tworzeniu nowej sesji na stronie wylogowania, co neguje konieczność duplikowania funkcji session_destroy(). –

Powiązane problemy