2017-06-27 1 views
0

このトピックに関するいくつかの記事を読んだが、依然としてクライアント側のセッションCookie、サーバー側のセッションファイル、およびPHPはガベージコレクション中にセッションを削除または保持することを「ランダムに」選択します。セッションが がを破壊され、中「アクティブでない」時間が過ぎるまでPHPセッションを維持する

  • ユーザがログインすると、ユーザーがアクティブでない場合、セッションは1時間の期間*
  • 始まる:

    私は確実にしようとしている動作です

*これは私のサイトにとっては非常に重要です。なぜなら、ユーザーは同じページで1時間も "アイドル"になっている可能性があるからです。実際にはアイドル状態ではありません。彼らは、私がこれまで使用しています何など、

をビデオを見て、長い報告書を構成することができることである。

session_start(); 
setcookie(session_name(),session_id(),time()+3600); 

このコードは、すべてのページのロード時に実行されます。

また、setIntervalを使用して毎分AJAXリクエストを発しています。これは、ユーザーが明らかに「アイドル」であるページに上記のコードを含むPHPスクリプトを読み込みます。

必要な動作を保証する方法はありますか?または私は何かを逃していますか?おそらく、この動作を保証するためのよりクリーンな方法があります。

事前に感謝します。

+2

[PHPでセッションタイムアウトを変更するにはどうすればいいですか?](https://stackoverflow.com/questions/8311320/how-to-change-the-session-timeout-in-php) –

+0

セッションのガベージコレクションの良い説明:https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – CD001

答えて

1

あなたはこのような何かを試みることができる:私は...まだ完全にクライアント側のセッションクッキー、サーバー側のセッションファイルとの間の関係を理解し​​ていない

if (isset($_SESSION['LAST_ACTIVITY'])&&(time() - $_SESSION['LAST_ACTIVITY'] > 3600)) { 
    // this takes 60 minutes 
    session_unset(); 
    session_destroy(); // destroy session data that is in storage 
} 
1

を、および方法PHPはガベージコレクション中にセッションを削除または保持することを「ランダムに」選択します。

クライアント側のCookieには、ユーザーに関する情報は含まれていません。これはトークンであり、新しい要求があるたびに他の情報とともにサーバーに送信されます。有効期限は、クライアント側のCookieが有効な期間を示します。

サーバー側のセッションファイルとガベージコレクションは別のものです。 php.iniでは、session.gc_maxlifetimeをデフォルトに設定して1440にすることができます。これは、「データがガベージとみなされ、潜在的にクリーンアップされるまでの秒数」を示します。そして、session.gc_probability(デフォルトは1)とsession.gc_divisor(デフォルトは100)です。

これは、1440秒後に、ガベージコレクタが開始され、現在はゴミとみなされているセッションをクリーニングすることを意味します。1/100

1時間後に100%の確率でセッションを削除する場合は、session.gc_probability0に設定し、古いセッションを手動で削除します。このために、データベースに「最後のアクティビティ」を保存して、「最後のアクティビティ」があり、1時間より大きいtime()の差があるセッションを削除するスクリプトをcronで作成できます。

関連する問題