$ _SESSIONを使用してユーザーIDを保存していましたが、ユーザーがブラウザーを閉じたときに認証された状態を維持できるように、SQLとペアになっている通常のCookie(KEY付き)を使用するように変更したいと思います。
SESSIONsテーブルの各行に一意のキーを作成するにはどうすればよいですか?
セッションCookieでのPHPのCookie有効期限の問題を回避するために、独自のセッションハンドラーを効果的に作成しようとしています。これは非常に簡単で、適切に実行されればかなり最適化されます。
ステップ1:セッションIDを生成する
セッションIDは一意です。ただし、永続的なセッションを計画している場合は、いくつかの点に注意する必要があります。接続の問題に関係なく、ブラウザごとにセッションを引き継ぐ必要があります。したがって、セッションIDをナビゲーターのユーザーエージェント(変更されない)にマッピングすることで、システムを少しごまかすことができます。
これにより、セッションIDジェネレーターが2人の異なる訪問者に対して同じIDを生成する可能性を減らすことができます。残りは乱数ジェネレーターとハッシュアルゴリズム次第ですmd5(microtime().$_SERVER['REMOTE_ADDR'])
が、通常は信頼できる友達です。
ステップ2:データの保存と取得
データの保存も簡単です。目的は、セッションキー(に設定PRIMARY
)とデータ(最も単純な形式のシリアル化された配列、として保存TEXT
)の2つ以上の列を持つMySQLテーブルを作成することです。
セッションを作成するときは、新しい行を挿入してエラーを監視するだけです。エラーが発生した場合、そのキーはすでに使用されているため、別のキーを再生成する必要があります。行が正常に挿入された場合-すべて正常です。これで、ユーザーのセッション行ができました。そこから行う必要があるのは、適切と思われるこの行に対して読み取り/書き込みを行うことだけです。
セッションIDを使用してユーザーにCookieを送信すれば、完了です。
警告
最良の方法は、いくつかのハッシュ関数を使用することです。これは、実際にはセッションIDを生成することによってPHP自体によっても使用されます。次のようなものを使用できます。
md5(microtime());
乱数、ユーザーエージェント、サーバー名など、より多くの値を組み合わせたり、SHA2などのより強力なアルゴリズムを使用したりできます。
ただし、一意性を保つために、そのようなハッシュがまだ保存されていない場合は、常にテーブルを調べる必要があります(ただし、もちろん確率は非常に低くなります)。
session_id()
しかし、私はすべての仕事をする標準に行くでしょう。
MySQLを使用できますUUID()
。
セッションを存続させたい場合は、PHPを使用することもできますsession_set_cookie_params()
。
ただし、SQLソリューションには1つの利点があります。それは、より多くのWebサーバーに簡単に拡張できることです。一方、PHPの$_SESSION
配列を使用することはできず、自分でセッション処理を作成する必要があります。