2011-07-01 17 views
7

PHP(バージョン5.2.10)でのセッション処理に問題があります。私は以下の機能をログイン、ログアウト、セッションの検証に使用しています。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(); 
} 

すべてのページが最初にvalidate_session()関数を呼び出します。セッションが無効な場合は、ログインページにリダイレクトされます。 login()関数は、ユーザーのセッションを作成するために使用されます。 ユーザーがログアウトをクリックすると、logout()関数が呼び出されてセッションが破棄されます。

問題がある:
警告::session_destroy():ランダムにログアウト()関数は警告をスローSessionオブジェクトの破壊は、私は非常にまれにしかこの警告を取得しています

に失敗しました。 20〜30回のログアウトの呼び出しのように、私は一度それを得る。何かご意見は?

私はWindows XPマシンで開発中です。

更新:セッションはファイルシステムに保存されます。
パス:C:\ WINDOWS \ Temp

+1

をそれはあなたがstackoverflowの上の任意の答えを受け入れてきたので、長い時間がかかったようです。.. –

+1

うん!私はstackoverflowであまり活発ではありません。そして、いくつかのケースで私はまだ満足のいく答えを得ていません。 – Varun

+0

こんにちはVarun、あなたはその比較の旅行equalsを使用する理由を説明できますか?通常、(!isset())で十分であれば、それはより厳しいが、isset()はブール値を返すべきであることは分かっています。本当に型を検証する必要がありますか?それはおそらくそうではありませんが、時にはそれが時折真実に戻ってくるかもしれません。 – picus

答えて

0

セッションをどのように保存していますか?ファイルベースの場合は、タイムアウトまたはアクセス権のエラーがありますか?

また、regenerate_idが破壊機能に技術的には存在しないセッションを探す原因になっているのだろうかと思います。あなたは、再生関数でブール値の引数をfalseに設定しようとしましたか?

私たちはCakePHPアプリでこの問題を抱えていましたが、Cake設定でジグザグに修正しました。

+0

セッションはファイルシステムに格納されます。私もあなたが提案したものを試しましたが、このエラーは一度もありました。私が言及したように、エラーは非常にまれにしか発生しません(時には1日に1回)、それは私がいくつかの変更を加え、それが問題を解決したかどうかを確認するのが非常に困難です。 – Varun

+0

別の質問ですが、警告が表示されたときにユーザーが実際にログアウトしていますか?それ以外の点は、警告を除いて、他のすべてが機能していますか?そのような場合は、警告が表示されるまで、つまりプロダクション環境の場合は警告を抑止することを検討してください。 – picus

0

見つかったsomethingこれはこのトピックで役に立つかもしれません。基本的な懸念事項は以下のとおりです。

  1. セッションがそもそも有効であるかどうか - session_start()からの戻り値は何ですか?
  2. セッションファイルがPHP.ini session.save_pathに存在するかどうかを削除することができます。

私はあなたのケースでは最初のものと思われます。私はどこで覚えていませんが、セッションが無効になって何らかの理由でプロセスを繰り返そうとした場合を見たと思います。

2

logout()はvalidate_session()以外の場所で呼び出されますか?そうでない場合、問題は(ログアウト前)session_destroyへの呼び出し(かもしれない)

あなたはこの試みることができる:

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

これは私の好みの解決策でもあり、validate_session()関数ではなくlogout関数にsession_destroyを追加すると論理的に意味があります。このソリューションが提供する利点の1つは、新しいセッションがログアウトページに作成されないようにすることで、session_destroy()関数を複製する必要がなくなります。 –

関連する問題