首頁 >後端開發 >php教程 >如何可靠地管理 PHP 會話 30 分鐘後過期?

如何可靠地管理 PHP 會話 30 分鐘後過期?

Barbara Streisand
Barbara Streisand原創
2024-12-25 04:59:16797瀏覽

How to Reliably Manage PHP Session Expiry After 30 Minutes?

如何管理PHP 會話在30 分鐘後過期

需要將會話保持在特定時間,然後終止它在網絡開發中很常見。 PHP 提供了設定會話逾時的選項,但它們可能不會總是產生可靠的結果。讓我們了解現有 PHP 機制的缺點,並探索可靠的解決方案。

PHP 內建逾時選項的可靠性問題

PHP 提供了兩種設定會話的選項timeouts:

  1. session.gc_maxlifetime:控制PHP 將會話資料視為「垃圾」並啟動清理的秒數。但是,此選項並不可靠,因為垃圾收集過程取決於 session.gc_probability 和 session.gc_divisor 確定的隨機機率。
  2. session.cookie_lifetime:指定發送的 cookie 的生命週期到瀏覽器。但是,此選項只會影響 cookie 的持續時間,不會使會話本身失效。

實作自訂會話逾時機制

建立可靠的會話逾時機制會話逾時,實作您自己的解決方案。這可以透過維護代表上次使用者活動的時間戳來實現。

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // Last request was more than 30 minutes ago
    session_unset(); // Unset $_SESSION variable
    session_destroy(); // Destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // Update last activity timestamp
  1. 檢查會話中是否存在「LAST_ACTIVITY」鍵,並驗證自上次活動以來是否已經過了 30 分鐘。
  2. 如果會話處於非活動狀態超過 30 分鐘,請使用 session_unset() 取消設定所有會話變數並使用銷毀會話session_destroy()。
  3. 定期更新每個請求的「LAST_ACTIVITY」時間戳,以在活動使用期間保持會話處於活動狀態。

因為每次要求更新會話資料都會修改會話檔案的修改日期,垃圾收集器不會過早刪除會話。

為了增加安全性,請考慮定期重新產生會話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 and invalidate old one
    $_SESSION['CREATED'] = time(); // Update creation time
}

附加說明

  1. 確保將session.gc_maxlifetime 設定為大於或等於自訂過期時間的值處理程序持續時間(本例中為1800)。
  2. 如果您希望將會話過期基於 30 分鐘的活動,請使用 setcookie(..., time() 60*30) 設定 cookie 過期時間,以保持會話 cookie 處於活動狀態。

以上是如何可靠地管理 PHP 會話 30 分鐘後過期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn