No.2
- 回答日時:
いまいち、質問者さんが考えている実現環境が明確でないのですが、要はWebサーバは物理的にいくつかあって、クライアントがどこのWebサーバにくるか正確にわからないという前提で、セッションを管理する方法があるかということであれば、方法はあると言う回答になるでしょう。
ANo.1にて出ているものもそうです。
そもそも、ホームページの運営という言葉とはかなりイメージが違うんですが、Webベースのシステムで、ログイン中のユーザをWebサーバが変わっても正しく認識できるようにしたいという話であれば、まずはセッション情報をどう扱うかという話になります。
ここでセッション情報の共有には2つのアプローチがあり、全Webサーバが共有して見れる場所に置くか、セッション情報自体を、レプリケーションして同じ物をみんなで共有するかです。これは設計にも関わることですが、いわゆるWebアプリケーションサーバと呼ばれるものは、この情報をレプリケーションする機能を持ったものが多いです。つまり後者のアプローチですね。
前者のアプローチの場合、大規模に使われるならデータベースにセッション情報を格納するか、セッション管理専用のサーバに任せる等の方法があります。セッション管理サーバを使う場合には、ここを二重化する際には、結局情報をレプリケーションする必要がありますけどね。
もっとお手軽に実現する場合には、各Webサーバが共有のNFSサーバを見れるようにしておき、そこにファイルベースでセッションを格納する方法もあります。
ただ、利用者数が多いとパフォーマンス的に問題も出やすいし、何よりNFS自体やることは単純な割に比較的運用が難しい機能である為、実現方法としてはお手軽でも、ちょっと微妙です。
質問者さんが、もう少し実現したいことをきちんと明確に説明してくれれば、他にも有用な回答があるかもしれませんが、今のままだと、この程度の一般論になりますね。
ありがとうございます。
私が実現したいことは、物理的にWebサーバを複数用意し、
クライアントはWebサーバ間を自由に移動できるけど、
セッションは維持したいということです。
最初はWebサーバ1台とDBサーバ1台で運用するのですが、
バーチャルホストで、loginサーバやinfoサーバなどを用意しておき、
後々それを物理サーバに移行したいと考えています。
どのWebサーバからもDBサーバにアクセスできるので、
DBにセッション情報を書き込むタイプがいいかなと思いました。
もし上記のような要件で、適切なセッション管理方法が
あればご教授ください。よろしくお願い致します。
No.3
- 回答日時:
ん~、まだ全然具体的とはいいがたいですね。
セッション情報を管理するっていうのは、まずポイントとして2つあります。
一つは、クライアント側にセッション情報をどう持たせるか。
もう一つが、サーバサイドのセッション情報保持です。
Webサーバ間を移動するってことは、クライアントから見て違う名前のホストにアクセスするってことですよね。となると、セッション情報をクッキーを使って保持するのは不可能なので、セッションIDを必ずURLに混ぜるとか、常にフォームを使った移動やアクションにしておき、POSTでセッションIDをもらうかという感じになります。後者はコンテンツ自体に制約が大きくなるというか、単なるリンクで済むものが、そうでなくなるのでいまいちですね。
で、適切な方法も何もこれでは、ぢゃあDBにセッション情報書きましょう、以上で終わってしまいますね。
ただ、言えることは、方法論としては言語によって適用できるとかできないとかの話ではないので、それがCGIベースの話であろうが、Javaサーブレットの話であろうが、大した問題ではありませんね。
Webアプリケーションサーバを使う場合には、逆にセッション情報をDBへ書き込む仕様のものは無かった(私もあまり製品の情報には詳しくないし)少なくとも私のわかる範囲の製品には、バックエンドのDBを使ってセッション情報を扱っていたものは無かったですね。
実装としては、さほど複雑にはならないと思います。
リクエストを受け付けた最初の処理で、必ず
1.クライアントからのセッションIDの取得
2.セッションIDが有効か否かの確認。
3.有効だったら、セッションに紐つくトークン(ログイン済みのユーザを表す情報の塊)を取得する。
逆にログイン時には、セッションIDと共に、トークンを生成することになります。
DBを使う場合には、セッションIDをキー項目にしたテーブルに、レコードを追加して、その内容がトークンということになるでしょうか。
トークンには、最低限の項目として、セッションID、ユーザ名、セッションの有効期限が必要でしょう。もちろん必要であれば、その他にも様々な情報を付与することも可能です。
トークンを取得する際には、有効期限を確認し、期限切れの場合には、エラーを返して、トークンを削除します。
また、ログアウト時にも、当然トークンは削除しますが、ログアウトという操作を必ず行ってくれるとは限らないので、期限切れのトークンをスイープするバッチ処理を定期的に走らせます。大抵はCRON等のスケジューラを使いますかね。
有効期限は、一般的には何かアクションを起こすたびに更新されますね。
トークンは、必ず毎回取得する情報になるので、あまり情報量をふやしすぎないのが得策でしょう。
その辺りはシステムとしてのバランスの問題ですが。
ここであげた事は基本的な手法の話ですから、実際に実装する際には環境や形態、あるいは用途により、いろいろ考えないといけない処もまだまだあります。
まあ、こんな感じで参考になりますかね。
返信遅くなりまして、すみません。
実は私はプログラマではなく、プログラマを雇う側の
人間なので、まだまだ勉強な点がありますが、
非常に参考になりました。ありがとうございました。
No.4ベストアンサー
- 回答日時:
実装法方法はいろいろ考えられると思いますが、私なら、と言う事で。
最終的にログインサーバを作る、と言う事ですので、セッションが開始されていない場合はどのサーバからもリダイレクトでログインサーバに飛ばすようにして、ログイン時に全てのサーバへセッション登録してしまえば良いと思います。
<?php
//ファイルヘッダー部分、セッション登録されていない場合はログインへ
session_start();
if($_SESSION[THIS_LOGIN] != "ON") header("Location: http://login.server.com/login.php");
?>
当然、セッション登録時には全てのサーバに登録する必要があると思います。
リダイレクトでセッション登録しながら一回りするとか、curl関数等を使って不可視で変数を渡すとか言う方法が考えられます。
DBは共通と言う事なので、セッションIDだけ
<?php
//curl関数でセッション登録してしまう場合
if(LOGIN IS TRUE){
//一つ目のサーバ
$sev1 = curl_init ("http://server1.com/sessin.php?id=".$sessid);
curl_exec ($sev1);
curl_close ($sev1);
//同様に
$sev2 = curl_init ("http://server2.com/sessin.php?id=".$sessid);
curl_exec ($sev2);
curl_close ($sev2);
$sev3 = curl_init ("http://server3.com/sessin.php?id=".$sessid);
curl_exec ($sev3);
curl_close ($sev3);
}
?>
こんな感じでログイン時のセッションIDを飛ばしておいて、それぞれのサーバでセッション登録すれば良いと思います。
実験してませんが、可能かと。
返信遅くなりました。
確かに、各サーバにセッションを飛ばせば、ログイン状態が維持できますね。
(ふと、各サーバの /tmp に保存されるセッションファイルを参照する際、
常にログインサーバの /tmp を読みに行くように設定すれば
セッションファイルを分散しなくていいのでは、なども思いつきましたが・・・)
とても参考になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ブラウザを閉じた後もセッショ...
-
セッションについて
-
PHPのセッション有効期限について
-
excel access連携 このテーブル...
-
ps3で久しぶりにCDの音楽情報取...
-
バッチファイルでpingの結果を...
-
積立投資してます。現在平均取...
-
findstrのerrorlevel
-
Google scholarがひらけなくな...
-
ミュージックのアートワークを...
-
(Win32)ファイルパスから物理ド...
-
開始と終了を指定して、その間...
-
syntax error, unexpected 'ech...
-
ループ forに関して for($i = ...
-
VBAでPDFファイルの文書のプロ...
-
アクセスの度にIPアドレスを変...
-
PHP の cURL で、htmlを画像へ...
-
vb作成したらでbeep音が鳴りま...
-
VBA内でのGetPixelを使用した時...
-
ThreadのHandleの取得方法を教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
ログイン画面をはさんだ後、自...
-
POSTで情報を他のサーバーに渡...
-
二重ログイン管理について
-
ブラウザを閉じた後もセッショ...
-
セッションのスコープ(有効範...
-
$_SESSIONと、POSTやGETの違い
-
セッション ID とセッション名...
-
【PHP】SESSION変数の競合を...
-
クッキーを使わないセッション...
-
テーブルデータをSESSIONに保存...
-
PHP cookieの値が更新されない...
-
PHPSESSIDの表示
-
別ブラウザ間でセッションの値...
-
複数ページでセッションを使わ...
-
session_start()で生成されるセ...
-
セッションについて
-
PHP SESSION変数を複数使用でき...
-
セッション変数にパスワードを...
-
セッションのワンタイムチケッ...
おすすめ情報