在 PHP 中設定會話超時

Subodh Poudel 2023年1月30日
  1. 在 PHP 中使用 session_unset()session_destroy() 函式設定會話超時
  2. 在 PHP 中使用 unset() 函式設定會話超時
  3. 在 PHP 中使用 session_regenerate_id() 函式更改當前會話 ID
在 PHP 中設定會話超時

本文將介紹一種在 PHP 中使用 session_unset()session_destroy() 函式銷燬會話的方法。我們將在 30 分鐘後銷燬會話。它檢查從最後一個活動到當前時間的時間間隔以銷燬會話。

我們還將演示使用 unset() 函式在 PHP 中設定會話超時的另一種方法。unset() 函式將會話變數作為引數。此方法使用陣列來儲存會話變數。

我們將介紹另一種使用 session_regenerate_id() 函式使當前會話 ID 無效的方法。該函式為當前會話生成一個新的會話 ID,破壞先前的會話 ID。

在 PHP 中使用 session_unset()session_destroy() 函式設定會話超時

我們可以使用 session_unset() 函式在執行時取消設定 $_SESSION 變數,並使用 session_destroy() 函式從儲存中銷燬會話。time() 函式返回當前時間。我們可以使用 $_SESSION 變數來儲存最後一個活動的時間戳。因此,我們可以通過計算從上次活動到當前時間的差異來檢查時間。這樣,我們檢查一個會話的時間間隔。

例如,使用 session_start() 函式在伺服器中啟動會話。檢查會話是否已使用 isset() 函式建立。使用 && 運算子檢查 isset() 函式內的其他條件。從 time() 函式中減去會話變數 start 並檢查結果是否大於 1800。在 if 條件中使用 session_unset()session_destroy()。然後顯示會話已被銷燬的訊息。在 if 條件之外,建立一個會話變數 $_SESSION['start'] 併為其分配 time() 函式以更新會話。

if 條件失敗,因為在下面的示例中尚未建立會話變數。當條件失敗時將建立會話。如果使用者沒有向伺服器傳送請求,會話將在 30 分鐘後過期。isset() 函式的後半部分檢查會話的總活動時間。1800 表示 1800 秒,相當於 30 分鐘。如果總活動時間超過 30 分鐘,則 if 條件為真。然後,它會破壞會話。程式碼的輸出對應於活動時間超過 30 分鐘後被銷燬的會話。檢視 PHP 手冊 以瞭解有關 session_unset() 函式的更多資訊。

示例程式碼:

# php 7.*
<?php
session_start();
if (isset($_SESSION['start']) && (time() - $_SESSION['start'] > 1800)) {
    session_unset(); 
    session_destroy(); 
    echo "session destroyed"; 
}
$_SESSION['start'] = time();
?>

輸出:

session destroyed

在 PHP 中使用 unset() 函式設定會話超時

我們可以使用 unset() 函式來銷燬 PHP 中特定會話變數的會話。該函式將 $_SESSION 變數作為引數。此方法將會話儲存在一個陣列中。我們可以使用關聯陣列來儲存會話名稱和會話開始時間。我們可以使用 time() 函式來獲取當前時間。我們可以按照上面提到的方法檢查會話時間間隔,從當前時間中減去活動會話時間。

例如,使用 session_start() 函式來啟動會話。編寫一個會話變數 $_SESSION['start'] 併為其分配一個關聯陣列。寫入鍵 0registered 併為相應的鍵寫入值 activetime()。檢查時間間隔是否大於 30 分鐘。如果條件為真,則編寫帶有 $_SESSION['start'] 作為引數的 unset() 函式。然後,顯示訊息 session destroyed。在 if 條件塊之外,使用 time() 函式更新會話變數 $_SESSION['start']

在下面的示例中,陣列包含會話變數。會話變數的值為 activetime() 函式在陣列中建立當前時間戳,鍵 registered 儲存該值。請檢視 PHP 手冊 以瞭解有關 $_SESSION 超全域性變數的更多資訊。

示例程式碼:

#php 7.x
<?php
session_start();
$_SESSION['start'] = array(0=> 'active', 'registered' => time())
if ((time() - $_SESSION['start']['registered']) > (60 * 30)) {
    unset($_SESSION['start']);
    echo "session destroyed";
}
$_SESSION['start'] = time();
?>

輸出:

session destroyed

在 PHP 中使用 session_regenerate_id() 函式更改當前會話 ID

我們可以使用 session_regenerate_id() 函式來更改當前會話的會話 ID。通過這種方式,我們可以防止我們的指令碼會話固定。函式中的布林值 true 可以生成新的 session-id。在這個方法中,我們可以在重新生成會話 id 之前和之後使用 session_id() 函式列印會話 id。但是會話不會隨著 session-id 的變化而過期。它只要求使用者再次登入。因此,它可以防止會話固定。

例如,使用 session_id() 函式啟動會話。使用 session_id() 函式顯示當前會話 ID。檢查會話是否已建立並建立會話 $_SESSION['start'] 並分配 time() 函式。找到會話處於活動狀態的時間間隔,就像我們在上述方法中所做的那樣。如果條件為真,則使用 session_regenerate_id(true) 函式。更新會話變數。在指令碼的末尾,使用 session_id() 函式列印新的會話 ID。

示例程式碼:

#php 7.x
<?php
session_start();
print("Old: ".session_id());
echo "<br>";
if (!isset($_SESSION['start'])) {
    $_SESSION['start'] = time();
} else if (time() - $_SESSION['start'] > 1800) {
    session_regenerate_id(true); 
    $_SESSION['start'] = time(); 
}
print("Now: ".session_id());
?>

輸出:

​Old: t38kssej37un38mtsoa6lovh05 
Now: mak7i3in708c6rl2udd8gbfo3r ​ ​
作者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn

相關文章 - PHP Session