PHP 會話

在本教程中,你將學習如何使用 PHP 會話臨時在伺服器上儲存某些資料。

什麼是會話

雖然你可以使用 Cookie 儲存資料,但它存在一些安全問題。由於 cookie 儲存在使用者的計算機上,因此攻擊者可以輕鬆修改 cookie 內容,從而在應用程式中插入可能會破壞應用程式的潛在有害資料。

此外,每次瀏覽器向伺服器請求 URL 時,網站的所有 cookie 資料都會自動傳送到請求中的伺服器。這意味著如果你在使用者系統上儲存了 5 個 cookie,每個 cookie 的大小為 4KB,則每次使用者檢視頁面時,瀏覽器都需要上傳 20KB 的資料,這可能會影響你網站的效能。

你可以使用 PHP 會話解決這兩個問題。PHP 會話將資料儲存在伺服器而不是使用者的計算機上。在基於會話的環境中,通過稱為會話識別符號或 SID 的唯一編號來標識每個使用者。此唯一會話 ID 用於將每個使用者與他們自己在伺服器上的資訊(如電子郵件,帖子等)相關聯。

提示: 會話 ID 由 PHP 引擎隨機生成,幾乎無法猜測。此外,由於會話資料儲存在伺服器上,因此不必隨每個瀏覽器請求一起傳送。

啟動 PHP 會話

在將任何資訊儲存在會話變數中之前,必須先啟動會話。要開始一個新會話,只需呼叫 PHP session_start() 函式即可。它將建立一個新會話併為使用者生成唯一的會話 ID。

以下示例中的 PHP 程式碼只是啟動一個新會話。

<?php
// Starting session
session_start();
?>

session_start() 函式首先通過查詢會話 ID 的存在來檢查會話是否已存在。如果找到一個,即如果會話已經啟動,則會設定會話變數,如果沒有,則通過建立新的會話 ID 來啟動新會話。

注意: 你必須在頁面開頭呼叫 session_start() 函式,即在指令碼在瀏覽器中生成的任何輸出之前,就像你在設定 setcookie() 功能性 cookie 時一樣。

儲存和訪問會話資料

你可以將所有會話資料儲存為 $_SESSION[] 超全域性陣列中的鍵值對。可以在會話的生命週期內訪問儲存的資料。請考慮以下指令碼,該指令碼建立新會話並註冊兩個會話變數。

<?php
// Starting session
session_start();
 
// Storing session data
$_SESSION["firstname"] = "Peter";
$_SESSION["lastname"] = "Parker";
?>

要訪問我們在前一個示例中從同一 Web 域上的任何其他頁面設定的會話資料 - 只需通過呼叫重新建立會話 session_start() ,然後將相應的金鑰傳遞給 $_SESSION 關聯陣列。

<?php
// Starting session
session_start();
 
// Accessing session data
echo 'Hi, ' . $_SESSION["firstname"] . ' ' . $_SESSION["lastname"];
?>

上例中的 PHP 程式碼生成以下輸出。

Hi, Peter Parker

注意: 要在同一頁面中訪問會話資料,不需要重新建立會話,因為它已經在頁面頂部啟動。

刪除會話

如果要刪除某些會話資料,只需取消設定 $_SESSION 關聯陣列的相應鍵,如下例所示:

<?php
// Starting session
session_start();
 
// Removing session data
if(isset($_SESSION["lastname"])){
    unset($_SESSION["lastname"]);
}
?>

但是,要完全刪除會話,只需呼叫 session_destroy() 函式即可。此函式不需要任何引數,單個呼叫會破壞所有會話資料。

<?php
// Starting session
session_start();
 
// Destroying session
session_destroy();
?>

注意: 在使用 session_destroy() 函式刪除會話之前,如果尚未使用該 session_start() 函式,則需要首先重新建立會話環境,以便有一些東西可以銷燬。

每個 PHP 會話都有一個超時值 - 一個以秒為單位的持續時間 - 它決定了在沒有任何使用者活動的情況下會話應該保持活動的時間。你可以通過更改 session.gc_maxlifetime PHP 配置檔案(php.ini)中的變數值來調整此超時持續時間。