一. cookie和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目錄。上圖:
從圖中我們可以看到確實在這個目錄下面,我們順便看看里面的內容
我的寫入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