PHP中Session使用方法

1. Session的聲明和使用

Session中的設(shè)置不同于Cookie, 必須先啟動(dòng),在PHP中必須調(diào)用session_start().

session_start()函數(shù)的語(yǔ)法格式如下:

Bool session_start(void) //創(chuàng)建Session,開(kāi)始一個(gè)會(huì)話(huà),進(jìn)行Session初始化

注意:session_start()函數(shù)前不能有任何輸出

當(dāng)?shù)谝淮卧L(fǎng)問(wèn)網(wǎng)站的時(shí)候,session_start()函數(shù)就會(huì)創(chuàng)建一個(gè)唯一的Session ID,并自動(dòng)通過(guò)HTTP的響應(yīng)頭,將這個(gè)Session ID保存在客戶(hù)端Cookie中。同時(shí),也在服務(wù)器端創(chuàng)建一個(gè)以session ID命名的文件,用于保存這個(gè)用戶(hù)的會(huì)話(huà)信息。當(dāng)同一個(gè)用戶(hù)在此訪(fǎng)問(wèn)這個(gè)網(wǎng)站時(shí),也會(huì)自動(dòng)通過(guò)HTTP的請(qǐng)求頭將Cookie中保存的Session ID再攜帶過(guò)來(lái),這是session_start()函數(shù)就不會(huì)再去分配一個(gè)新的Session ID,而是在服務(wù)器的硬盤(pán)中去尋找和這個(gè)Session ID同名的Session文件,將這之前為這個(gè)用戶(hù)保存的會(huì)話(huà)信息讀出,在當(dāng)前腳本中應(yīng)用,達(dá)到跟蹤這個(gè)用戶(hù)的目的。Session以數(shù)組的形式使用,如: $_SESSION['session名']

2. 注冊(cè)一個(gè)會(huì)話(huà)變量和讀取Session

在PHP中使用Session變量,除了要啟動(dòng)之外,還要經(jīng)過(guò)注冊(cè)的過(guò)程。注冊(cè)和讀取session變量,都要通過(guò)訪(fǎng)問(wèn)$_SESSION數(shù)組完成。在$_SESSION關(guān)聯(lián)數(shù)組中的鍵名具有和PHP中普通變量相同的命名規(guī)則。注冊(cè)SESSION變量的代碼如下:

//啟動(dòng)session的初始化

session_start()

//注冊(cè)session變量,賦值為一個(gè)用戶(hù)的名稱(chēng)

$_SESSION["username"] = "name";

//注冊(cè)session變量,賦值為一個(gè)用戶(hù)的ID

$_SESSION["uid"] = 1;

執(zhí)行完該腳本之后,兩個(gè)Session變量就會(huì)被保存在服務(wù)器端的某個(gè)文件中,該文件是通過(guò)php.ini文件,在session.save_path屬性指定的目錄下。

3. 注銷(xiāo)變量與銷(xiāo)毀Session

當(dāng)使用完一個(gè)Session變量后,可以將其刪除,當(dāng)完成一個(gè)會(huì)話(huà)后,也可以將其銷(xiāo)毀。如果用戶(hù)退出Web系統(tǒng),就需要為他提供一個(gè)注銷(xiāo)功能,把他的所有信息在服務(wù)器中銷(xiāo)毀。銷(xiāo)毀和當(dāng)前Session有關(guān)的所有的材料,可以調(diào)用session_destroy()函數(shù)結(jié)束對(duì)話(huà)。并清空會(huì)話(huà)中的所有資源。該函數(shù)的語(yǔ)法格式如下:

bool session_destroy(void) //銷(xiāo)毀和當(dāng)前Session有關(guān)的所有資料

該函數(shù)并不會(huì)釋放和當(dāng)前Session相關(guān)的變量,也不會(huì)刪除保存在客戶(hù)端Cookie中的Session ID。因?yàn)?_SESSION數(shù)組在使用上和自定義數(shù)組是相同的,所以我們可以使用unset()函數(shù)來(lái)釋放在Session中注冊(cè)的單個(gè)變量。

unset($_SESSION['鍵名'])

一定要注意,不要使用unset($_SESSION)刪除整個(gè)$_SESSION數(shù)組,這樣將不能再通過(guò)$_SESSION超全局?jǐn)?shù)組注冊(cè)變量了。但如果想把某個(gè)用戶(hù)在Session中注冊(cè)的所有變量都刪除,可以直接將數(shù)組變量$_SESSION賦上一個(gè)空數(shù)組。如下所示:

$_SESSION=array()

PHP某人的Session是基于Cookie的,SessionID被服務(wù)器存儲(chǔ)在客戶(hù)端的Cookie中,所以在注銷(xiāo)Session時(shí)也需要清楚Cookie中保存的SessionID. 而這就必須借助setCookie()函數(shù)完成。在PHP腳本中,可以通過(guò)調(diào)用session_name()函數(shù)獲取Session名稱(chēng)。刪除存在客戶(hù)端Cookie中的SessionID

//判斷Cookie中是否存在session ID

if(isset($_COOKIE[session_name()])){

? ? //刪除包含Session ID的cookie,注意第四個(gè)參數(shù)一定要和php.ini設(shè)置的路徑相同

? ? setcookie(session_name(),'',time()-3600,'/');

}

綜上,Session的注銷(xiāo)過(guò)程分為四步。在下例中,提供完整的四個(gè)步驟代碼,運(yùn)行該腳本就可以關(guān)閉Session,并銷(xiāo)毀與本次會(huì)話(huà)有關(guān)的所有資源。

//第一步:開(kāi)啟Session并初始化

session_start();

//第二部:刪除所有Session的變量,也可以用unset($_SESSION[XXX])逐個(gè)刪除

$_SESSION = array();

//第三部:如果使用基于Cookie的session,使用setCookkie()刪除包含Session ID的cookie

if(isset($_COOKIE[session_name()])) {

? ? setCookie(session_name(), "", time()-42000, "/");

}

//第四部:最后徹底銷(xiāo)毀session

session_destroy();

4. session的php.ini配置選項(xiàng)

php.ini文件和Session有關(guān)的幾個(gè)常用配置選項(xiàng):

session.auto_start = 0 ; 在請(qǐng)求啟動(dòng)時(shí)初始化session

session.cache_expire = 180 ; 設(shè)置緩存中的會(huì)話(huà)文檔在 n 分鐘后過(guò)時(shí)

session.cookie_lifetime = 0 ; 設(shè)置按秒記的cookie的保存時(shí)間,相當(dāng)于設(shè)置Session的過(guò)期時(shí)間,為0時(shí)表示直到瀏覽器被重啟

session.auto_start=1,這樣就無(wú)需每次使用session之前都要調(diào)用session_start()不建議使用.但啟用該選項(xiàng)也有一些限制,如果確實(shí)啟用了

session.auto_start,則不能將對(duì)象放入會(huì)話(huà)中,因?yàn)轭?lèi)定義必須在啟動(dòng)會(huì)話(huà)之前加載以在會(huì)話(huà)中重建對(duì)象。

session.cookie_path?=/?;?cookie的有效路徑

session.cookie_domain?=?;?cookie的有效域

session.name?=?PHPSESSID;?用在cookie里的session的名字

session.save_handler?=?files?;?用于保存/取回?cái)?shù)據(jù)的控制方式

session.save_path?=/tmp?;?在?save_handler?設(shè)為文件時(shí)傳給控制器的參數(shù),?這是數(shù)據(jù)文件將保存的路徑.

session.use_cookies?=?1?;?是否使用cookies

5. Session的垃圾自動(dòng)回收機(jī)制

可以通過(guò)session_destroy()函數(shù)在頁(yè)面中提供一個(gè)“退出”按鈕,通過(guò)單擊銷(xiāo)毀本次會(huì)話(huà)。但如果用戶(hù)沒(méi)有單擊退出按鈕,而是直接關(guān)閉瀏覽器,或斷網(wǎng)等情況,在服務(wù)器端保存的Session文件是不會(huì)刪除的。雖然關(guān)閉瀏覽器,下次需要重新分配一個(gè)新的Session ID重新登錄,但這只是因?yàn)樵趐hp.ini中的設(shè)置seesion.cookie_lifetime=0,來(lái)設(shè)定Session ID在客戶(hù)端Cookie中的有效限期,以秒為單位指定了發(fā)送到瀏覽器的Cookie的生命周期。當(dāng)系統(tǒng)賦予Session有效期限后不管瀏覽器是否開(kāi)啟,Session ID都會(huì)自動(dòng)消失。而客戶(hù)端Session ID消失服務(wù)器端保存的Session文件并沒(méi)有被刪除。所以沒(méi)有被Sessoin ID引用的服務(wù)器端Session文件,就成為了“垃圾”。

服務(wù)器保存的Session文件就是一個(gè)普通文本文件,所以都會(huì)有文件修改時(shí)間?!袄厥粘绦颉眴?dòng)后就是根據(jù)Session文件的修改時(shí)間,將所有過(guò)期的Session文件全部刪除。通過(guò)在php.ini中設(shè)置session.gc_maxlifetime選項(xiàng)來(lái)指定一個(gè)時(shí)間(單位:秒),例如設(shè)置該選項(xiàng)值為1440(24分鐘)。“垃圾回收程序”就會(huì)在所有Session文件中排查,如果有修改時(shí)間距離當(dāng)前系統(tǒng)時(shí)間大于1440秒的就將其刪除。

“session垃圾回收程序”是怎樣的啟動(dòng)機(jī)制呢?“垃圾回收程序”是在調(diào)用session_start()函數(shù)時(shí)啟動(dòng)的。而一個(gè)網(wǎng)站有多個(gè)腳本,沒(méi)有腳本又都要使用session_start()函數(shù)開(kāi)啟會(huì)話(huà),又會(huì)有很多個(gè)用戶(hù)同時(shí)訪(fǎng)問(wèn),這就很可能session_start()函數(shù)在1秒內(nèi)被調(diào)用N次,而如果每次都會(huì)啟動(dòng)“session垃圾回收程序”,這樣是很不合理的??梢酝ㄟ^(guò)php.ini文件中修改“session.gc_probability和session.gc_divisor”兩個(gè)選項(xiàng),設(shè)置啟動(dòng)垃圾回收程序的概率。會(huì)根據(jù)“session.gc_probability/session.gc_divisor”公示計(jì)算概率,例如選項(xiàng)session.gc_probability=1,而選項(xiàng)session.gc_divisor=100,這樣的概率就是“1/100”,即session_start()函數(shù)被調(diào)用100次才會(huì)有一次可能啟動(dòng)“垃圾回收程序”。

6. php.ini中相關(guān)的配置

session.cookie_lifetime=0; 關(guān)閉瀏覽器相應(yīng)的cookie文件即被刪除

session.gc_maxlifetime; 設(shè)置過(guò)期session時(shí)間,默認(rèn)1440秒(24分鐘)

session.gc_probability/session.gc_divisor; 啟動(dòng)垃圾回收機(jī)制的概率(建議值為1/1000——5000)

7. cookie禁用時(shí)通過(guò)URL傳遞session的ID

  使用Session跟蹤一個(gè)用戶(hù),是通過(guò)在各個(gè)頁(yè)面之間傳遞唯一的Session ID,并通過(guò)Session ID提取這個(gè)用戶(hù)在服務(wù)器中保存的Session變量。常見(jiàn)的Session ID傳送方法有以下兩種。

  第一種方法是基于cookie的方式傳遞session ID,這種方式更優(yōu),但不總是可用, 因?yàn)橛脩?hù)在客戶(hù)端可以屏蔽cokie;

  第二種方法是通過(guò)url參數(shù)進(jìn)行傳遞,直接將session ID嵌入到URL中去。

在Session的實(shí)現(xiàn)中通常都是采用Cookie的方式,客戶(hù)端保存的Session ID就是一個(gè)Cookie。當(dāng)客戶(hù)禁用Cookie時(shí),Session ID就不能在Cookie中保存,也就不能在頁(yè)面之間傳遞,此時(shí)Session失效。不過(guò)PHP5在Linux平臺(tái)可以自動(dòng)檢查Cookie狀態(tài),如果客戶(hù)端禁用它,則系統(tǒng)自動(dòng)把Session ID附加到URL上傳送。而使用Windows系統(tǒng)作為Web服務(wù)器則無(wú)此功能。

在PHP中提出了跟蹤Session的另一種機(jī)制,如果客戶(hù)瀏覽器不支持Cookie,則PHP可以重寫(xiě)客戶(hù)請(qǐng)求的URL,把Session ID添加到URL信息中。

//材料來(lái)源于網(wǎng)絡(luò)?PHP中session使用方法詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Session的聲明與使用 Session的設(shè)置不同于Cookie,必須先啟動(dòng),在PHP中必須調(diào)用session_...
    尋回驕傲閱讀 3,006評(píng)論 0 18
  • PHP Session 本文由以下兩篇博客整理而成, 傳送門(mén)如下:Cookie和Session的作用,區(qū)別和各自的...
    其實(shí)我很dou閱讀 1,324評(píng)論 0 1
  • session原理總結(jié)[轉(zhuǎn)] 之前在學(xué)校的時(shí)候,只知道session與cookie的區(qū)別在于:session是保存...
    foolgry閱讀 630評(píng)論 0 1
  • 應(yīng)用 不要使用 unset($_SESSION) 來(lái)復(fù)位超級(jí)變量 $_SESSION,這樣會(huì)導(dǎo)致無(wú)法繼續(xù)在 $_S...
    觀察者魔石閱讀 524評(píng)論 0 0
  • 受昨天美股的影響,上午一開(kāi)始就是高開(kāi),接著開(kāi)始上漲,沖擊上面的缺口,結(jié)果沒(méi)沖多久就開(kāi)始往下,截止收盤(pán)跌了0.7%左...
    人生的畫(huà)布閱讀 83評(píng)論 0 0

友情鏈接更多精彩內(nèi)容