日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

PHP Session的生存周期與用法詳解

 好亂非常亂 2016-09-25

session 是一種服務(wù)器端用于存儲(chǔ)有關(guān)用戶會(huì)話信息的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu),也可能就是使用散列表,來(lái)保存信息.

當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè) session 的時(shí)候,服務(wù)器首先會(huì)檢查這個(gè)客戶端是否已經(jīng)包含了一個(gè) session 標(biāo)識(shí),這個(gè)我們稱為 session id(獲取方法為 session_id()),如果已包含一個(gè) session id 則說(shuō)明此客戶端之前已經(jīng)創(chuàng)建過(guò) session,服務(wù)器則按照 session id 把這個(gè) session 中的值檢索出來(lái),如果客戶端不包含 session id,說(shuō)明此客戶端第一次請(qǐng)求服務(wù)器或手動(dòng)清除過(guò)緩存文件,則為此客戶端創(chuàng)建一個(gè) session 并且生成一個(gè)與此 session 相關(guān)聯(lián)的 session id,一般來(lái)說(shuō),session id 的值是不會(huì)重復(fù)的,并且加密的字符串,這個(gè) session id 將被在本次響應(yīng)中返回給客戶端保存.

session 在何時(shí)被創(chuàng)建?

通常(是指通常)是在瀏覽器向服務(wù)器端第一次請(qǐng)求時(shí)被創(chuàng)建,并且它會(huì)占用一定的內(nèi)存空間,因此在不必要的情況下,盡最關(guān)閉 session.

session 何時(shí)被刪除

通常情況下,session 在會(huì)在這幾種情況下被刪除,一是使用 session_destroy() 重置函數(shù)手動(dòng)刪除,二是 session 的上次活動(dòng)時(shí)間距離當(dāng)前時(shí)間的間隔超過(guò)了 session 的超時(shí)設(shè)置的時(shí)間,三是服務(wù)器進(jìn)程被停止.

怎么在瀏覽器關(guān)閉時(shí)刪除 session

理論上來(lái)說(shuō),是做不到這一點(diǎn),http是一種無(wú)狀態(tài)協(xié)議,因此服務(wù)器不知道客戶端什么時(shí)候關(guān)掉的瀏覽器,并且PHP也沒(méi)有一個(gè)關(guān)相的函數(shù)來(lái)獲取此項(xiàng)信息,但這個(gè)問(wèn)題還可以得到解決,就是使用代碼 window.oncolose 來(lái)監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后用Ajax向服務(wù)器端發(fā)送一個(gè)請(qǐng)求來(lái)刪除 session,但這個(gè)辦法也并不會(huì)完全解決問(wèn)題,原因是在有些情況下比如瀏覽器崩潰、突然斷電、用戶死機(jī)等這些時(shí)候并不能作出反應(yīng)。

在PHP中有關(guān)Session的函數(shù)比較多,不過(guò)我們最常用到的也就這么幾個(gè)函數(shù):

session_start(), session_register(),session_unregister(),

session_is_registered(),session_destroy函數(shù).

session_start():啟用session機(jī)制,在需要用到session的程序文件的最開(kāi)始調(diào)用它.

session_register():注冊(cè)session變量

session_unregister(): 刪除session變量(一個(gè)一個(gè)刪除)

session_is_registered(): 判斷session變量是否注冊(cè)

session_distroy(): 銷毀所有session變量(所有session變量銷毀)

我們來(lái)看一下驗(yàn)證程序,假設(shè)數(shù)據(jù)庫(kù)存儲(chǔ)的是用戶名和 md5 加密后的密碼,代碼如下:

// 表單提交后...  
$posts = $_POST;  
// 清除一些空白符號(hào)  
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);  
}  
$password = md5($posts['password']);  
$username = $posts['username'];
 
$query = 'SELECT `username` FROM `user` WHERE `password` = '$password'';  
// 取得查詢結(jié)果  
$userInfo = $DB->getRow($query);
 
if (!emptyempty($userInfo))  
{  
if ($userInfo['username'] == $username)  
{  
// 當(dāng)驗(yàn)證通過(guò)后,啟動(dòng) Session  
session_start();  
// 注冊(cè)登陸成功的 admin 變量,并賦值 true  
$_SESSION['admin'] = true;  
}  
else
{  
die('用戶名密碼錯(cuò)誤');  
}  
}
else
{
die('用戶名密碼錯(cuò)誤');  
}

我們?cè)谛枰脩趄?yàn)證的頁(yè)面啟動(dòng) Session,判斷是否登陸,代碼如下:

// 防止全局變量造成安全隱患  
$admin = false;
 
// 啟動(dòng)會(huì)話,這步必不可少  
session_start();
 
// 判斷是否登陸  
if (isset($_SESSION['admin']) && $_SESSION['admin'] === true)  
{  
echo '您已經(jīng)成功登陸';
}  
else  
{
// 驗(yàn)證失敗,將 $_SESSION['admin'] 置為 false
$_SESSION['admin'] = false;  
die('您無(wú)權(quán)訪問(wèn)');  
}

需要注意下面幾個(gè)方面:

1.函數(shù)session_start()必須在程序最開(kāi)始執(zhí)行,在其前面不能有任何輸出內(nèi)容,否則就會(huì)出現(xiàn)“Warning:Cannot send session cookie - headers already sent'類似這樣的警告信息.

2.函數(shù)session_register()用于注冊(cè)要保存在session中的相關(guān)變量,其用法如下:

 $val = 'session value';
 session_register('val');
>

val即為要注冊(cè)的session變量名,在注冊(cè)時(shí)一定不要加上'$'符號(hào),只寫(xiě)其變量名稱即可.

3.函數(shù)session_unregister()與上面函數(shù)用法完全相同,但功能相反,上面函數(shù)是注冊(cè)session變量,而其則是刪除指定的session變量.

4.函數(shù)session_is_registered()用于判斷session變量是否注冊(cè).

5.函數(shù)session_destroy()主要用于在系統(tǒng)注銷和退出時(shí),銷毀所有的session變量,它沒(méi)有參數(shù),直接調(diào)用即可.


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多