PHP セッションを 30 分後に期限切れにするにはどうすればいいですか? 質問する

PHP セッションを 30 分後に期限切れにするにはどうすればいいですか? 質問する

セッションを 30 分間維持してから破棄する必要があります。

ベストアンサー1

独自のセッションタイムアウトを実装する必要があります。他の人が言及した両方のオプション(セッション.gc_maxlifetimeそしてセッション.cookie_lifetime)は信頼できません。その理由を説明します。

初め:

session.gc_maxlifetime
session.gc_maxlifetime は、データが「ガベージ」とみなされてクリーンアップされるまでの秒数を指定します。ガベージ コレクションはセッションの開始時に発生します。

しかし、ガベージコレクターは、セッション.gc_確率で割ったセッション.gc_divisorこれらのオプションのデフォルト値 (それぞれ 1 と 100) を使用すると、その可能性はわずか 1% になります。

まあ、これらの値を調整して、ガベージ コレクターをより頻繁に起動することもできます。ただし、ガベージ コレクターが起動すると、登録されているすべてのセッションの有効性がチェックされます。これはコストがかかります。

さらに、PHPのデフォルトを使用する場合セッション.save_handlerファイルの場合、セッションデータは指定されたパスのファイルに保存されます。セッション.save_pathこのセッション ハンドラーでは、セッション データの経過時間は、最終アクセス日ではなく、ファイルの最終変更日に基づいて計算されます。

注意:デフォルトのファイルベースのセッション ハンドラーを使用している場合、ファイル システムはアクセス時間 (atime) を追跡する必要があります。Windows FAT では追跡されないため、FAT ファイル システムまたは atime 追跡が利用できないその他のファイル システムを使用している場合は、セッションのガベージ コレクションを処理する別の方法を見つける必要があります。PHP 4.2.3 以降では、atime の代わりに mtime (変更日) が使用されています。したがって、atime 追跡が利用できないファイル システムでは問題は発生しません。

そのため、セッション データが最近更新されていないためにセッション自体はまだ有効であると見なされているにもかかわらず、セッション データ ファイルが削除される可能性もあります。

そして2番目:

session.cookie_lifetime
session.cookie_lifetime は、ブラウザに送信される Cookie の有効期間を秒単位で指定します。[…]

はい、その通りです。これはクッキーの有効期間にのみ影響し、セッション自体は有効なままです。しかし、セッションを無効にするのはサーバーの役割であり、クライアントの役割ではありません。したがって、これは何の役にも立ちません。実際、session.cookie_lifetimeを に設定すると0、セッションのクッキーは実際にセッションクッキーこれはブラウザが閉じられるまでのみ有効です。

結論 / 最善の解決策:

最善の解決策は、独自のセッション タイムアウトを実装することです。最後のアクティビティ (つまり、リクエスト) の時間を示す単純なタイム スタンプを使用し、リクエストごとに更新します。

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

リクエストごとにセッション データを更新すると、セッション ファイルの変更日も変更されるため、ガベージ コレクターによってセッションが早期に削除されることがなくなります。

追加のタイムスタンプを使用してセッションIDを定期的に再生成し、次のようなセッションへの攻撃を防ぐこともできます。セッション固定:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

ノート:

  • session.gc_maxlifetimeこのカスタム有効期限ハンドラーの有効期間(この例では 1800)以上である必要があります。
  • 開始から30分後ではなく、アクティビティの 30 分後にセッションを期限切れにしたい場合は、セッション クッキーをアクティブに保つために、有効期限とともに も使用する必要があります。setcookietime()+60*30

おすすめ記事