2

session_start()必要以上の呼び出しを避けながら、PHP カスタム セッション ID を実装したいと考えています。

基本的に、1 つの単純なアルゴリズムは

session_start();
if ( ! isset( $_SESSION['MyStuff'] )) {
  session_write_close();
  session_id( generate_my_id() );
  session_start();
}

$_SESSION['MyStuff'] = some stuff...;

セッションが期限切れになった場合、または最初に存在しなかった場合、最初のセッションはsession_start()独自の ID を作成し、Cookie をブラウザーに送信します。その後、セッションが終了し、別の Cookie が送信されて別のセッションが作成されます (さらに、セッション ファイルの作成とクローズのオーバーヘッドが発生します)。

別の解決策は、PHPSESSID Cookie が存在するかどうか、およびその値が - 家庭で調理された - generate_my_id() 関数に従ってフォーマットされているかどうかをテストしてから、$_SESSION 値かどうかを再度テストすることです。しかし、セッションの有効期限が切れた場合 ($_SESSION['MyStuff'] がない場合)、不要なsession_start()ものが呼び出されます。

質問は、私の観察に基づいて、実際には2つの質問です

  • を呼び出す前に、PHP がセッション ID を作成する方法を指定する方法はありますか (可能ではないようです) session_start()

  • 新しいセッションを作成する必要があるかどうかを確認する方法はありsession_start()ますか、それとも利用可能なサーバー側を使用するだけですか? (それは最初の呼び出しを排除します)

どんな良い代替案でも大歓迎です。

編集

カスタム ID とは何かについての明確化。

セッション ID は、PHP がサーバー上のセッションを取得するために使用する文字列キーであり、各ユーザーは異なるキーを持っています。通常、そのキーは Cookie に保存され、ブラウザはその Cookie をリクエストとともにサーバー / PHP に送信して、セッションに「接続」します。PHP は、設定に基づいて、MD5 (ユーザーおよび時間関連データ) または SHA1 (同じ関連データ) に基づいて、セッション ID キーを自動的に設定します。したがって、セッション ID は MD5 または SHA1 キーのいずれかであり、できれば一意です。

カスタム ID は、md5/sha1 の作成をバイパスして、プログラマ (私) が手動で作成したキーです。

4

2 に答える 2

1

遅い回答ですが、PHP v5.5.1 の変更ログを確認してください

まだ文書化されていませんが、create_sid メソッドのみである SessionIdInterface と呼ばれる新しいインターフェイスを参照します。

interface SessionIdInterface  {
    public function create_sid ();
}
于 2014-01-03T18:56:01.390 に答える
1
  1. session.hash_functionはい、5.3 以降では、セッション ID の生成時にハッシュ アルゴリズムを指定できます。独自のハッシュ アルゴリズムを使用することはお勧めしません。特に、ハッシュに付属するアルゴリズムは拡散、速度、衝突などについて広範囲にテストされているためです。

  2. 通常、Cookie はセッションを永続化するために使用されるため、その情報を使用してsession_start()が新しいセッションを作成するかどうかを判断できます。

session_start()以下は、必要なステートメントの数を最小限に抑える方法を示しています。それは既存のコード(OOである)から推測されます:

do {
    // discover session by cookie
    if (isset($_COOKIE[session_name()])) {
        session_start();
        // validate session contents
        if (!isset($_SESSION['MyStuff'])) {
            // destroy session and regenerate id
            session_destroy();
            session_regenerate_id(true); // skip this if you generate your own
        } else {
            // validation passed, no need to populate
            break;
        }
    }
    // populate new session
    // you can use session_id($your_id) here
    session_start();
    $_SESSION['MyStuff'] = 'foobar';
} while (false);

現在のセッションが有効な場合に 2 番目をスキップできるように、この奇妙なdo { } whileループは単に美化されたものです。gotosession_start()

于 2012-10-16T08:39:36.243 に答える