1

プロジェクトにPHPを使用しています。ユーザーがブラウザーを閉じるとセッションが終了し、ログアウトされるように、セッションの有効期間を 0 に設定しました。ただし、ユーザーがログインしているかどうかを示す情報を格納するステータス変数が DB にあります。これを使用して、特定のユーザーのステータスを他のユーザーに通知します。

セッションが終了したときに、DB の値を変更する関数を呼び出すにはどうすればよいですか? session_set_save_handler() のオーバーライドについて調べました。しかし、そのためには、関数全体をオーバーライドして、独自のセッションを定義する必要があります。DB 変数を変更するために呼び出される関数はありますか?

私が達成しようとしていることを実装するためのより良い方法はありますか?

ありがとう

編集:私と同じ状況にある人のために、私はnikicが提案したことをしました. すべてのユーザーがアクセスした各ページを追跡するログがあります。ユーザーがオンラインかどうかを確認するために、DB をチェックして、ログイン変数が設定されているかどうかを確認し、最近のアクティビティがあったかどうかを再確認して、ユーザーが実際にオンラインかどうかを確認します。

4

3 に答える 3

1

そうする簡単な方法はありません。通常、サイトはユーザーの最後のアクションをデータベースに保存し、最後の N 分間にユーザーがアクションを実行したときだけだと言います。さらに、ユーザーが手動でログアウトした場合、最終アクション時間を 0 に設定して、それも考慮に入れることができます。

于 2010-10-14T20:37:14.833 に答える
0

PHP のセッション ガベージ コレクターは、スクリプトをトリガーして「ユーザーはオンライン」変数を更新するコールバック メカニズムを提供しません。それはとてもいいことですが、最近の PHP にはありません。

デフォルトのファイルベースのセッションハンドラーを使用していると仮定すると、タイムアウト期間より古いセッションファイルのセッション保存ディレクトリをスキャンし、それに基づいてデータベースを更新するスクリプトを簡単に作成できます。「セッション ファイルが 30 分以上経過している場合は、データベースでユーザーを「ログアウト」に設定してください。」これを行うには、ユーザーのデータベース ID をセッション ファイルに保存し、それを抽出するか (セッション ファイルはserialize()の内容にすぎませ$_SESSION[]ん)、ファイル名からセッション ID を抽出し ('sess_' . session_id()デフォルト)、それを使用してデータベース。

処理する巨大な DB インターフェイス ライブラリがない限り、これが 20 行または 30 行を超えるコードになるとは思えません。SPL DirectoryIteratorを使用すると、ファイルの「mtime」をスキャンするのは簡単です。

于 2010-10-14T21:59:43.790 に答える
-1

実際には、有効期限が 0 のセッションは、ユーザーがリクエストを行うたびに終了します。サーバーは、ブラウザーが開いているか閉じているかを知る方法がありません。これが、セッションが X 分後に期限切れになる理由です (そして、そもそもセッション全体の概念がある理由です)。

于 2010-10-14T20:38:21.943 に答える