6

ユーザーのセッション タイムアウトが発生したときにユーザーをログアウトしようとしています。私の場合、ユーザーをログアウトするには、データベースでユーザーの「オンライン」ステータスを変更する必要があります。
オブザーバー パターンを使用して、ユーザー セッションの状態を監視し、セッションの有効期限が切れたときにコールバックをトリガーするものを作成できるのではないかと考えていました。これにより、データベースを更新できるようにユーザーの名前が保持されます。セッション側でどこから始めればよいか正確にはわかりません。コールバックをセッションのタイムアウトに関連付けることはできますか?

これらは、利用可能な pear または zend セッション パッケージに組み込まれていますか? そのために使えるものは何でも使う!



更新 @ 16:33:
ユーザーが相互に対話できるシステムがあるとしたらどうしますか (ただし、オンライン ユーザーとしか対話できません)。ユーザーは、現在オンラインになっている他のユーザーを知る必要があります。

ページを更新するたびにセッションがまだ有効かどうかを確認するだけの場合、タイムアウト後、ユーザーはログインしていないページに送られますが、システムではまだオンラインとしてリストされています。

セッションをタイムアウトすると、ログアウトに使用できるユーザーに関する情報が失われることを除いて、その方法は問題ありません。



更新 @ 16:56:
右。ありがとう。私は同意します...ちょっと醜いです。サーバーの遅いポーリングがすでに発生しているため、そのメソッドを実装するのは非常に簡単です。これは、セッション処理パッケージにとって非常に便利な機能のように思えます。Zend と PEAR の両方にセッション パッケージがあります。

4

6 に答える 6

2

最も単純なケースを最初に取り上げます。システムに1人のユーザーがいて、そのセッションをタイムアウトさせ、そのステータスを正確に報告したいとします。ユーザーが12分間ページにアクセスしておらず、セッションタイムアウトが10分に設定されています。2つのうちの1つが起こります。彼らはすぐにまた訪れるか、そうでないかのどちらかです。彼らが再び訪問しない場合、システムはどのようにコードを実行してタイムアウトステータスを更新しますか?唯一の方法*は、現在「セッション中」のステータスにあるすべてのユーザーに対して、別のプロセスでステータス更新機能を開始することです。

ユーザーがサイトにアクセスするたびに、セッションを最後にアクセスした時間に関連付けるデータベース内の変数を更新します。次に、毎分実行されるcronジョブを作成します。単純な関数を呼び出して、セッションのステータスを確認します。タイムアウト期間より古いセッションは、ステータス「タイムアウト」に設定されます。(タイムアウトしたセッションがしばらく座った後も、テーブルをクリーンアップする必要があります)。ログインしている人の数に関するレポートが必要な場合は、タイムアウト間隔の開始より後の最終アクセス時刻を持つすべてのレコードを照会します。

"*"他の方法もありますが、単純なWebアプリケーションの目的では、実際には必要ありません。単純なWebアプリよりも複雑なものがある場合は、特定のニーズを反映するように質問を更新してください。

于 2008-10-29T16:55:46.247 に答える
2

ユーザーがページにアクセスするたびに、データベースでその時間をマークし、この列を LastAccessed と呼びます。ユーザーがサイトのログアウト部分をクリックすると、この値を null に設定できます。現在ログインしているユーザーのリストを検索するクエリを作成する場合は、次の手順を実行します。

SELECT *  FROM Users WHERE LoggedIn=1 AND LastAccess > DATEADD(Minute,-20.GETDATE())

まだアクティブなセッションを持っているユーザーを返します。おそらく MySQL/PHP では動作しない SQL を許してください。

于 2008-10-29T17:29:01.453 に答える
1

なぜあなたはこれをしたいのですか?一般的なアプローチは、タイムアウトの期限が切れているかどうか、ユーザーから送信されたすべての要求をチェックすることです。もちろん、これは、タイムアウトに達した場合でもユーザーがログイン済みとして表示されるため、データベースのステータスが最新ではないことを意味します。

しかし、通常は問題ではない実用的な目的のために。

于 2008-10-29T16:28:05.120 に答える
0

醜いがおそらく実行可能な提案:

非同期のkeep-aliveリクエスターをページに追加します。これにより、最後にアクティブなタイムスタンプが更新されます。次に、ユーザーが20秒以上前の最後にアクティブなタイムスタンプを持っている場合にユーザーをオフラインとしてマークするcronジョブを作成できます。そのcronジョブを毎分実行するように設定すると、うまくいきます。ユーザーのセッションがタイムアウトしたとき、またはブラウザを閉じたときに何かが発生するようにトリガーする方法があるかどうかはわかりません。

于 2008-10-29T16:47:07.967 に答える
0

私の最初の考えは、ログインしていることをアクティブなセッションがあると解釈するカスタムセッションハンドラーを作成できるということです。

カスタムセッションハンドラーの作成に関するいくつかの例については、http: //www.daniweb.com/code/snippet43.htmlを参照し、PHPドキュメントhttp://ca.php.net/manual/en/function.session-set-をお読みください。 save-handler.php

于 2008-10-29T17:04:47.027 に答える
0

これは古い質問かもしれませんが、あなたの質問に対する「最良の」答えはここにあります: http://www.codeguru.com/forum/archive/index.php/t-372050.html

php.ini ファイルには、sesison.save_path という設定が含まれています。これにより、PHP がセッション データを含むファイルを配置する場所が決まります。セッションが古くなると、次のガベージ コレクション中に PHP によって削除されます。したがって、そのセッションのフィールドが存在するかどうかのテストは、セッションがまだ有効かどうかを判断するのに十分なはずです。

$session_id = 'session_id';
$save_path = ini_get('session.save_path');

if (! $save_path) {
$save_path = '.'; // if this vlaue is blank, it defaults to the current directory
}

if (file_exists($save_path . '/sess_' $session_id)) {
unlink($session_id); // or whatever your file is called
}
于 2011-10-12T04:35:27.473 に答える