基本用法

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

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

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

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

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

示例 #1 在 $_SESSION 中注冊(cè)變量。

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

示例 #2 從 $_SESSION 中反注冊(cè)變量。

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

警告

千萬不要使用 unset($_SESSION) 來復(fù)位超級(jí)變量 $_SESSION, 因?yàn)檫@樣會(huì)導(dǎo)致無法繼續(xù)在 $_SESSION 中注冊(cè)會(huì)話變量。

警告

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

注意:

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

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