0

私は PHP の初心者であり、PHP セッションの初心者でもありますが、それについて多くのことを読んでいます。しかし、私は自分の問題に対する答えを見つけることができませんでした。簡略化したバージョンを次に示します。 1 - ユーザーがページのフォームに名前を入力します 2 - php ファイルが名前を取得し、セッションを開始し、ユーザーが表示できるいくつかのカスタマイズされたファイルを含むユーザー用のディレクトリをサーバー上に作成します.

質問は次のとおりです。これは真のログイン メカニズムではないため、ログアウトやセッション タイムアウトは発生せず、タイムアウトを強制したくありません。そのため、ユーザーがブラウザ ページを開いている限り、サーバー上でユーザー用に作成されたディレクトリに引き続きアクセスできます。サーバー上のカスタム ディレクトリを削除できるように、ブラウザが閉じられ、ユーザーがもうセッションを使用していないことを知るにはどうすればよいですか? サーバー上にある使用可能なセッション ファイルに関連するものはありますか?削除されたセッション。

session_destroy() が呼び出されない場合、サーバー上のセッションに何が起こるかはわかりません。

4

5 に答える 5

1

ブラウザが閉じられ、ユーザーがもうセッションを使用していないことを確認して、サーバー上のカスタム ディレクトリを削除するにはどうすればよいですか?

理論的には、それを知ることはできません。2 つのオプションがあります。以下の各オプションには、それぞれ長所と短所があります。

  • bodyonunloadイベントを使用してサーバーにリクエストを送信し、セッションを破棄します。常に機能しません。ユーザーが 2 つのタブを開いて 1 つを閉じる場合の最も単純な例。
  • AJAX リクエストが 3 分ごとにサーバーにヒットするようにします。長時間のセッションでは役に立ちません。もちろん、通常のセッションで期待する内容に応じて「3 分」をカスタマイズできます。

サーバー上にあるセッションファイルに関連して使用できるものはありますか

上記の場合、手動でセッションを破棄しています。セッションを破棄するときに、ディレクトリも削除できます。

session_destroy() が呼び出されない場合、サーバー上のセッションに何が起こるかはわかりません。

セッションには有効期限があります。次を使用して「取得」できます。 ini_get("session.gc_maxlifetime");

ini_set("session.gc_maxlifetime","3600" ); を使用して設定します。//3600 分。

于 2012-04-24T04:59:27.180 に答える
1

「ブラウザが開いている限り」という定義そのものが、ステートレス HTTP 接続では非常に扱いにくいものです。簡単に言えば、ブラウザとサーバーの間に永続的な接続がないという事実だけでは、ブラウザウィンドウが開いている時間や閉じている時間を確実に知ることはできません。ブラウザーがページを要求し、サーバーがそれを配信すると、接続が閉じられます。ページはブラウザでまだ開いている場合と開いていない場合があり、ブラウザが最終的に戻って別のページを要求する場合としない場合があります。あなたは知らないだけです。

そのため、セッションを含むすべてのサーバー側の状態はタイムアウトに基づいています。クライアントが x 時間戻ってこなかった場合、クライアントが去ったと見なして、保存されたデータを破棄できます。

他のことをするのはトリッキーで、欠点があります。たとえば、ページに Javascript を追加して、時々リクエストを送信し、ユーザーがまだそこにいることをサーバーに伝えることができます。ただし、実際には何も起こっていないときに、多くの異なるクライアントから一定のハートビートを受信するため、サーバーに高い負荷がかかります。

beforeunloadもう 1 つの方法は、ユーザーがページを閉じたことを検出するために使用できる Javascript イベントにフックすることです。ただし、常に機能することが保証されているわけではありません。さまざまな理由により、サーバー上ですべてのページがアンロードされるわけではありません。したがって、このシナリオでも、古いデータは最終的に自分で破棄する必要があります。

最善の方法は、タイムアウトと期限切れデータの削除のアイデアを中心に、やりたいことを構造化することです。これが本当に信頼できる唯一の方法だからです。

于 2012-04-24T05:00:32.767 に答える
0

私の記憶が正しければ、セッションのデフォルトのタイムアウトは 1440 秒なので、自動的に期限切れになります。問題がなければ、何もしません。

于 2012-04-24T05:36:19.373 に答える
0

これは真のログイン メカニズムではないため、ログアウトやセッション タイムアウトは発生せず、タイムアウトを強制したくありません。

実際には、これは真のログイン メカニズムです。ユーザーは「フォームに名前を入力する」ことでログインを実行します。その後、ユーザーはログインします。ユーザー名とはまったく異なります。

「ログアウト」メカニズムがありません。

ブラウザが閉じられたとき、終了したときなどを知らせるためにブラウザに依存することはできません-信頼性が低く、機能しません. したがって、最善の(そして唯一の)解決策は、サーバー側でセッションの状態を確認することです。15 分ごとに php ファイルを実行する CRON ジョブを作成するだけです。php ファイルが実行されるたびに、すべてのセッションの最後のアクティビティ時間がチェックされます。最後のアクティビティ時間がタイムアウト制限よりも長い場合は、クリーンアップを実行してください。

「タイムアウトを課したくない」と言ったのは知っていますが、どこかで砂に線を引いて、「私のユーザーが X 分間 (または X 時間) 非アクティブである場合は -その場合、彼らは去って戻ってこないと想定しても安全です!」. 本当に高いしきい値を設定するだけです。

于 2012-04-24T05:13:39.370 に答える
0

何もない。絶対に特別なことは何も起こりません。Seesions は一定の時間で期限切れになり、再認証が必要になります。

于 2012-04-24T04:55:35.300 に答える