工作階段是一種簡單的方法,可以針對個別使用者儲存資料,並使用唯一的工作階段 ID。這可以用於在頁面請求之間維持狀態資訊。工作階段 ID 通常透過工作階段 Cookie 傳送到瀏覽器,而 ID 則用於擷取現有的工作階段資料。如果沒有 ID 或工作階段 Cookie,PHP 就會知道要建立新的工作階段,並產生新的工作階段 ID。
Session 的運作流程很簡單。當一個 session 開始時,PHP 會使用傳入的 ID(通常來自 session cookie)擷取現有的 session,或者如果沒有傳入 session ID,則會建立一個新的 session。在 session 開始後,PHP 會使用任何 session 資料填充 $_SESSION 超全域變數。當 PHP 關閉時,它會自動取得 $_SESSION 超全域變數的內容,將其序列化,並使用 session 儲存處理程式將其發送以進行儲存。
預設情況下,PHP 使用內建的 files
儲存處理程式,該處理程式由 session.save_handler 設定。這會將 session 資料儲存在伺服器上 session.save_path 設定指令指定的位置。
可以使用 session_start() 函式手動啟動 session。如果 session.auto_start 指令設定為 1
,則 session 將在請求啟動時自動啟動。
Session 通常在 PHP 執行完腳本後自動關閉,但也可以使用 session_write_close() 函式手動關閉。
範例 #1 使用 $_SESSION 註冊變數。
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
範例 #2 使用 $_SESSION 取消註冊變數。
<?php
session_start();
unset($_SESSION['count']);
?>
您不能在 session 變數中使用參考,因為沒有可行的方法可以將參考恢復到另一個變數。
備註:
基於檔案的 session(PHP 中的預設值)會在透過 session_start() 或隱式地透過 session.auto_start 開啟 session 後鎖定 session 檔案。一旦鎖定,其他腳本就無法存取同一個 session 檔案,直到第一個腳本終止或呼叫 session_write_close() 關閉它為止。
這在大量使用 AJAX 並且有多個並行請求的網站上最可能成為一個問題。處理它的最簡單方法是在對 session 進行任何必要的更改後立即呼叫 session_write_close(),最好是在腳本的早期。或者,可以使用支援並行處理的不同 session 後端。