3

session_regenerate_id()開発中のアプリケーションでPHPを機能させるのに問題があります。アプリケーションは(緩い)自作のMVCフレームワークを使用し、ファイルを使用してすべてのリクエストをリダイレクトします。.htaccessindex.php

ログアウト時にセッションIDを再生成しようとしていますが、正しく機能していません。

これが私のログアウトコントローラーからのコードです-期限切れの変数はセッションタイムアウトのチェックです:

    session_regenerate_id(true);        
    if(isset($_SESSION['expired']))
    {
        $this->registry->template->expired = true;
    }

    session_unset();
    session_destroy();

index.phpファイルの先頭からのコードも関連しています。

    session_cache_expire(20);
    session_start();
    session_name("TMU");
    //session_regenerate_id();

各ページの下部にある結果をエコーアウトして、session_id()再生成されたかどうかをテストするために何が含まれているかを確認しています。

ただし、ログアウトしてもセッションIDは変更されません。(別のアカウントでも)再度ログインすると、セッションIDは同じになります。

index.phpファイルのコメントアウトされた4行目に気付くでしょう。その行のコメントを外すと、IDはすべてのページで適切に再生成されているように見えます。ただし、行を再度コメントアウトすると、セッションIDは、インデックスファイルの行のコメントを解除する前の元のIDになります...

どうすればsを機能させることができるのか疑問に思っていますession_regenerate_id()。変更されたIDを「コミット」していないようです。使用してみましsession_commit()たが、どのように機能するのかよくわかりません。セッションを破棄しようとするとエラーが発生しました。

PHP5.3.10およびapache2.2.21

4

1 に答える 1

5

このトピックを何度か再検討した後、私はそれを理解しました。2つの問題がありました。

  1. session_regenerate_id()HTML出力が表示されたり、ヘッダーが送信されたりする前に呼び出す必要があります。(のように、最初の関数の1つとして呼び出す必要がありますsession_start())。
  2. 注文が重要です。session_name("TMU")望ましい結果を得るには、前に呼び出す必要がsession_start()あります-私はこれを以前はキャッチしていませんでした。

基本的に、私に起こっていたのは、2つのセッションID Cookie(2つのセッション)を設定することでした。1つはTMUという名前で、もう1つはデフォルトのPHPSESSIDですsession_name("TMU")session_start()順序を変更すると、すべての問題が修正され、IDの再生成/古いセッションの破棄が期待どおりに機能するようになりました。

これを行うのに問題がある場合は、$_SESSION配列と$_COOKIE配列をエコーアウトして、特定のアプリケーションで何が起こっているかを確認することをお勧めします。

于 2012-04-19T14:56:02.963 に答える