
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 を読みに行くように設定すれば
セッションファイルを分散しなくていいのでは、なども思いつきましたが・・・)
とても参考になりました。ありがとうございました。
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.2
- 回答日時:
いまいち、質問者さんが考えている実現環境が明確でないのですが、要はWebサーバは物理的にいくつかあって、クライアントがどこのWebサーバにくるか正確にわからないという前提で、セッションを管理する方法があるかということであれば、方法はあると言う回答になるでしょう。
ANo.1にて出ているものもそうです。
そもそも、ホームページの運営という言葉とはかなりイメージが違うんですが、Webベースのシステムで、ログイン中のユーザをWebサーバが変わっても正しく認識できるようにしたいという話であれば、まずはセッション情報をどう扱うかという話になります。
ここでセッション情報の共有には2つのアプローチがあり、全Webサーバが共有して見れる場所に置くか、セッション情報自体を、レプリケーションして同じ物をみんなで共有するかです。これは設計にも関わることですが、いわゆるWebアプリケーションサーバと呼ばれるものは、この情報をレプリケーションする機能を持ったものが多いです。つまり後者のアプローチですね。
前者のアプローチの場合、大規模に使われるならデータベースにセッション情報を格納するか、セッション管理専用のサーバに任せる等の方法があります。セッション管理サーバを使う場合には、ここを二重化する際には、結局情報をレプリケーションする必要がありますけどね。
もっとお手軽に実現する場合には、各Webサーバが共有のNFSサーバを見れるようにしておき、そこにファイルベースでセッションを格納する方法もあります。
ただ、利用者数が多いとパフォーマンス的に問題も出やすいし、何よりNFS自体やることは単純な割に比較的運用が難しい機能である為、実現方法としてはお手軽でも、ちょっと微妙です。
質問者さんが、もう少し実現したいことをきちんと明確に説明してくれれば、他にも有用な回答があるかもしれませんが、今のままだと、この程度の一般論になりますね。
ありがとうございます。
私が実現したいことは、物理的にWebサーバを複数用意し、
クライアントはWebサーバ間を自由に移動できるけど、
セッションは維持したいということです。
最初はWebサーバ1台とDBサーバ1台で運用するのですが、
バーチャルホストで、loginサーバやinfoサーバなどを用意しておき、
後々それを物理サーバに移行したいと考えています。
どのWebサーバからもDBサーバにアクセスできるので、
DBにセッション情報を書き込むタイプがいいかなと思いました。
もし上記のような要件で、適切なセッション管理方法が
あればご教授ください。よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- サーバー 別サーバに構築したApache+Tomcatの連携について 2 2023/03/06 23:23
- その他(コンピューター・テクノロジー) 以下の用語がわかんないので教えてください!!! ①プロトコルの変換をする装置。トランスポート層からア 1 2023/07/05 09:10
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
- ドメイン・サーバー・クラウドサービス サクラサーバーでのHPのUPについて 1 2023/06/10 11:21
- サーバー ログオンユーザーがいない場合に自動再起動 1 2022/09/28 09:53
- ネットワーク 瞬快 コンソール操作 ローカル端末のファイルをリモート端末にコピーする方法がない? 1 2023/03/17 18:56
- VPN DNS「8.8.8.8」とは何なのでしょうか? 固定 IP アドレスで光回線の代わりに使えますか? 4 2022/10/17 16:30
- サーバー メールサーバーについて詳しい方、メールサーバーの管理業務経験のある方、教えてください。 3 2022/11/12 18:24
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- ネットワーク ニフティメールのiPhoneとWin PCでの運用 1 2023/03/30 11:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
ログインしたら他からログイン...
-
セッション変数の命名規則
-
ログイン画面をはさんだ後、自...
-
完全なセッション破棄をしたい
-
複数ページでセッションを使わ...
-
別ブラウザ間でセッションの値...
-
PHP cookieの値が更新されない...
-
Sessionの上限について
-
「戻る」ボタンで値の保持
-
PHPSESSIDについて
-
PHPでログイン人数を制限したい
-
sessioncookieをではなくcookie...
-
PHP SESSION変数を複数使用でき...
-
swfファイルでセッション情報を...
-
セッション変数と配列
-
PHPSESSIDの表示
-
ブラウザを閉じた後もセッショ...
-
PHPのセッション有効期限について
-
学校の授業で困っていることが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
PHPSESSIDの表示
-
PHPのセッション有効期限について
-
Sessionの上限について
-
ログイン画面をはさんだ後、自...
-
ログインしたら他からログイン...
-
セッションについて
-
セッション変数にパスワードを...
-
sessioncookieをではなくcookie...
-
クッキーを使わないセッション...
-
セッションのスコープ(有効範...
-
二重ログイン管理について
-
完全なセッション破棄をしたい
-
PHP cookieの値が更新されない...
-
ブラウザを閉じた後もセッショ...
-
PHPでログイン人数を制限したい
-
swfファイルでセッション情報を...
-
セッションを用いたデータの変...
-
セッション変数と配列
-
PHPSESSIDについて
おすすめ情報