session詳解


一. cookie和session

1. 由於HTTP協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識具體的用戶,這個機制就是Session.典型的場景比如購物車,當你點擊下單按鈕時,由於HTTP協議無狀態,所以並不知道是哪個用戶操作的,所以服務端要為特定的用戶創建了特定的Session,用用於標識這個用戶,並且跟蹤用戶,這樣才知道購物車里面有幾本書。這個Session是保存在服務端的,有一個唯一標識。在服務端保存Session的方法很多,內存、數據庫、文件都有。集群的時候也要考慮Session的轉移,在大型的網站,一般會有專門的Session服務器集群,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如Memcached之類的來放 Session。

2. 思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次創建Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 里面記錄一個Session ID,以后每次請求把這個會話ID發送到服務器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL后面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別用戶。

3. Cookie其實還可以用在一些方便用戶的場景下,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了,怎么辦?這個信息可以寫到Cookie里面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。

所以,總結一下:
Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中;
Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。
 

二. session_start的作用

session_start()會做兩件事:

1、在客戶端生成一個存放PHPSESSID的cookie文件,

這個文件的存放位置和存放方式跟程序的執行方式有關,不同的瀏覽器也不盡相同,這一步會產生一個序列化后的字符串——PHPSESSID;

2、在服務端生成一個存放session數據的臨時文件;

存放的位置由session.save_path參數指定,名稱類似於“sess_b2f326ee7a8b7617c215a30d22a602f1”,“sess_”代表這是個session文件,“b2f326ee7a8b7617c215a30d22a602f1”即此次會話的PHPSESSID,跟客戶端的PHPSESSID一定是一樣的。這個文件里存放的就是$_SESSION變量里的具體值,格式為:

變量名 | 變量類型 : [長度] : 值

eg:test|s:7:"test111";test2|i:22222;

 

三. session_id的作用


session_id() 存取目前 session 代號。
語法:   string session_id(string [id]); 


本函數可取得或者重新配置目前存放 Session 的代號。若無參數 id 則表示只有取得目前 Session 的代號,加上參數則表示將 Session 代號設成新指定的 id。輸入及返回均為字符串。
輸出 session_id()

<?php
    session_start(); 
    echo session_id();
    // 輸出 dqr58dnuqj2gufvg4o3tmjb9v4
?>


設置 session_id()

<?php
    session_id("NowaMagic");
    session_start(); 
    
    echo session_id();
    // 輸出 NowaMagic
?>

 

四. session存儲

.session的擴展:默認session存儲在哪里。
在php.ini配置文件中有這么一行 session.save_handler = files,
files,說明了php默認的是用文件讀寫的方式來保存session的。那么在哪個目錄呢?繼續看。session.save_path = "/tmp",
這一行前面有個 ; ,說明是被注釋的,不過即便這樣,php默認的
session 也是保存在這里的,/tmp目錄。上圖:
document/2015-08-31/55e44c61f3733
從圖中我們可以看到確實在這個目錄下面,我們順便看看里面的內容

document/2015-08-31/55e44c8eb3e27
我的寫入session的語句是:
$_SESSION['as'] = 'as';
解讀一下,第一個as代表的是$_SESSION['as']中的as,|后面的s表示的是這是一個字符串類型的數據,2表示的是這個字符串所占的字節數,最后雙引號引起來的是值as。

 更多存儲方式:https://blog.csdn.net/fb408487792/article/details/47804241

 

實際session例子以及session_id安全見另一篇博文:https://www.cnblogs.com/saysmy/p/8535571.html

 

參考:

https://www.zhihu.com/question/19786827/answer/28752144

http://www.manongjc.com/article/1267.html

https://www.bgpy.net/biancheng/php_49756.html

http://phpbook.phpxy.com/58029

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM