基本用法

通過為每個獨立用戶分配唯一的會話 ID,可以實現(xiàn)針對不同用戶分別存儲數(shù)據(jù)的功能。 會話通常被用來在多個頁面請求之間保存及共享信息。 一般來說,會話 ID 通過 cookie 的方式發(fā)送到瀏覽器,并且在服務(wù)器端也是通過會話 ID 來取回會話中的數(shù)據(jù)。 如果請求中不包含會話 ID 信息,那么 PHP 就會創(chuàng)建一個新的會話,并為新創(chuàng)建的會話分配新的 ID。

會話的工作流程很簡單。當(dāng)開始一個會話時,PHP 會嘗試從請求中查找會話 ID (通常通過會話 cookie), 如果請求中不包含會話 ID 信息,PHP 就會創(chuàng)建一個新的會話。 會話開始之后,PHP 就會將會話中的數(shù)據(jù)設(shè)置到 $_SESSION 變量中。 當(dāng) PHP 停止的時候,它會自動讀取 $_SESSION 中的內(nèi)容,并將其進(jìn)行序列化, 然后發(fā)送給會話保存管理器來進(jìn)行保存。

默認(rèn)情況下,PHP 使用內(nèi)置的文件會話保存管理器(files)來完成會話的保存。 也可以通過配置項 session.save_handler 來修改所要采用的會話保存管理器。 對于文件會話保存管理器,會將會話數(shù)據(jù)保存到配置項 session.save_path 所指定的位置。

可以通過調(diào)用函數(shù) session_start() 來手動開始一個會話。 如果配置項 session.auto_start 設(shè)置為1, 那么請求開始的時候,會話會自動開始。

PHP 腳本執(zhí)行完畢之后,會話會自動關(guān)閉。 同時,也可以通過調(diào)用函數(shù) session_write_close() 來手動關(guān)閉會話。

示例 #1 在 $_SESSION 中注冊變量。

<?php
session_start
();
if (!isset(
$_SESSION['count'])) {
  
$_SESSION['count'] = 0;
} else {
  
$_SESSION['count']++;
}
?>

示例 #2 從 $_SESSION 中反注冊變量。

<?php
session_start
();
unset(
$_SESSION['count']);
?>

警告

千萬不要使用 unset($_SESSION) 來復(fù)位超級變量 $_SESSION, 因為這樣會導(dǎo)致無法繼續(xù)在 $_SESSION 中注冊會話變量。

警告

由于無法將一個引用恢復(fù)到另外一個變量, 所以不可以將引用保存到會話變量中。

注意:

無論是通過調(diào)用函數(shù) session_start() 手動開啟會話, 還是使用配置項 session.auto_start 自動開啟會話, 對于基于文件的會話數(shù)據(jù)保存(PHP 的默認(rèn)行為)而言, 在會話開始的時候都會給會話數(shù)據(jù)文件加鎖, 直到 PHP 腳本執(zhí)行完畢或者顯式調(diào)用 session_write_close() 來保存會話數(shù)據(jù)。 在此期間,其他腳本不可以訪問同一個會話數(shù)據(jù)文件。

對于大量使用 Ajax 或者并發(fā)請求的網(wǎng)站而言,這可能是一個嚴(yán)重的問題。 解決這個問題最簡單的做法是如果修改了會話中的變量, 那么應(yīng)該盡快調(diào)用 session_write_close() 來保存會話數(shù)據(jù)并釋放文件鎖。 還有一種選擇就是使用支持并發(fā)操作的會話保存管理器來替代文件會話保存管理器。

  • <form id="rh407"></form>