在 PHP 中設定會話超時
-
在 PHP 中使用
session_unset()
和session_destroy()
函式設定會話超時 -
在 PHP 中使用
unset()
函式設定會話超時 -
在 PHP 中使用
session_regenerate_id()
函式更改當前會話 ID
本文將介紹一種在 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']
併為其分配一個關聯陣列。寫入鍵 0
和 registered
併為相應的鍵寫入值 active
和 time()
。檢查時間間隔是否大於 30 分鐘。如果條件為真,則編寫帶有 $_SESSION['start']
作為引數的 unset()
函式。然後,顯示訊息 session destroyed
。在 if
條件塊之外,使用 time()
函式更新會話變數 $_SESSION['start']
。
在下面的示例中,陣列包含會話變數。會話變數的值為 active
。time()
函式在陣列中建立當前時間戳,鍵 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 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