天天看點

Session以及模拟會話機制

初學者對session總是不明白咋回事,這篇文章将闡述這個問題,并且實操模拟會話機制。

1,Session實質是啥? ==存貯在伺服器端硬碟中的session檔案,一個session一個檔案。

檔案名:32位随機編碼字元串如伺服器/tmp目錄下【/tmp /sess_01aab840166fd1dc253e3b4a3f0b8381】

格式:變量名 | 類型 | 長度 | 值

具體看文章:https://blog.csdn.net/yt_php/article/details/80464890

注:當然你也可以資料庫建個Session表存session,(站點通路量很大的情況下)

2,Session的産生?

針對http局限性(無狀态無記憶)-提出的保持(用戶端<--->伺服器)保持連接配接狀态的機制。

3,原理?

Session儲存于伺服器端(預設以檔案方式存儲session),根據用戶端提供的session id來得到使用者的檔案,取得變量的值,session id可以使用用戶端的Cookie或者Http1.1協定的Query_String(就是通路的URL的“?”後面的部分)來傳送給伺服器,然後伺服器讀取Session的目錄……。也就是說,session id是取得存儲在服務上的session變量的身份證。當代碼session_start();運作的時候,就在伺服器上産生了一個session檔案,随之也産生了與之唯一對應的一個session id,定義session變量以一定形式存儲在剛才産生的session檔案中。通過session id,可以取出定義的變量。跨頁後,為了使用session,你必須又執行session_start();将又會産生一個session檔案,與之對應産生相應的session id,用這個session id是取不出前面提到的第一個session檔案中的變量的,因為這個session id不是打開它的“鑰匙”。如果在session_start();之前加代碼session_id($session id);将不産生新的session檔案,直接讀取與這個id對應的session檔案。 按照上面的思想,我隻要把session_id存在在cookie中就可以正常使用session了。

注:sessionID 是識别使用者的,這個使用者的意思不是你登陸網站的使用者名,這個要搞清楚!這個ID是你的電腦組態、浏覽器版本等等組成的資訊,它是唯一的.你在你家打開360浏覽器通路了一個網址,這個網址就會傳給你一個ID,儲存在你浏覽器的COOKIE裡,ID就是唯一的你的身份,同時網址伺服器給你開辟了一塊資料區域叫SESSION,下次通路這個網址會帶着這個ID,伺服器就可以找到屬于你的資料區域,存或者取session資料。

4,禁用cookie模拟會話

代碼補充:

$sname = session_name();//session名 何處列印都是一樣的

//如果伺服器給我傳遞了ID

if( isset($_GET[$sname]) ){

$sid = $_GET[$sname];

echo "<a href=sever.php?id=".$sid.">我已接收id,再次發送請求</a>";

}else{

//初次通路

echo "<a href=sever.php>初次通路</a>";

}

ini_set('session.gc_maxlifetime', 3600);

if(!isset($_GET['id'])){

session_start();//執行此句 開辟一個新的使用者區域

$a = session_name();

$b = session_id();//q8k57hmtu6eci6jlaj75kidt21

$_SESSION['user'] ='myinfo';//給這個使用者存入辨別資訊

echo "<a href=client.php?$a=".$b.">給你發送Session_id</a>";

}

if(isset( $_GET['id'] ) ){

session_id($_GET['id']);//先指定哪個使用者的session

session_start();//打開這個使用者的session

if($_SESSION['user'] == 'myinfo'){

echo "我認得你!"; //取出來了

}

}