2019-01-02讀書筆記
《laravel框架關鍵技術解析》
會話篇
1,cookie分為兩類:A會話cookie、B持久cookie。
時間:A退出瀏覽器則被刪除。B退出瀏覽器、計算機重啟依然存在。
存貯:A記憶體、B磁碟。
2,會話Cookie在客戶端(瀏覽器)、服務端之間的傳遞
[客戶端] <----響應首部Set-Cookie:id=1----[服務端PHP setcookie(“id”,“1”)設定]
[客戶端] -------請求首部Cookie:id=1-------->[服務端PHP $_COOKIE()獲取]
3,持久cookie一般需要通過Expires、Max-Age引數特殊配置
兩者都是用來指定文件的過期時間,但是二者有一些細微差別:
1.Expires在HTTP/1.0中已經定義,Cache-Control:max-age在HTTP/1.1中才有定義,為了向下相容,僅使用max-age不夠;
2.Expires指定一個絕對的過期時間(GMT格式:Expires: Thu(星期), 01 Dec(月) 1994 16:00:00 GMT),這麼做會導致至少2個問題:
(1) 客戶端和伺服器時間不同步導致Expires的配置出現問題
(2) 很容易在配置後忘記具體的過期時間;
3.max-age 指定的是從文件被訪問後的存活時間,這個時間是個相對值(比如:3600s),相對的是文件第一次被請求時伺服器記錄的Request_time(請求時間)
4.Expires指定的時間可以是相對檔案的最後訪問時間(Atime=AccessTime)或者修改時間(MTime)
原文:
4,Expires、Max-Age引數
服務端PHP:
setcookie("id","1",time()+3600)
響應頭部:星期三,2019-01-03 01:15:15過期,有效期3600s。
"Set-Cookie:id=1;expires=Thu,03-Jan-2019 01:15:15 GMT;Max-Age=3600"
5,Cookie的刪除
setcookie("id","",time()-10);
6,Transfer-Encoding:chunked
HTTP1.1採用了持久的連線,也就是一次TCP的連線不馬上釋放,允許許多的請求跟響應在一個TCP的連線上傳送,所以客戶機與伺服器需要某種方式來標示一個報文在哪裡結束和在下一個報文在哪裡開始。簡單的方法是使用呢content-length,但這隻有當報文長度可以預先判斷的時候才起作用,而對於動態的內容或者在傳送資料前不能判定長度的情況下,可以使用分塊的方法來傳送編碼。
原文:
7,session_start()
先判斷客戶端是否攜帶了sessionID
----->第一次請求:
請求報文:Cookie:無PHPSESSID
未攜帶:
則將sessionID新增到響應首部,
響應報文:Set-Cookie:PHPSESSID=ppqfhplmkf1b372sr4cefi92797; path=/
,
生成一個同名的檔案存貯在伺服器中
[file] : ppqfhplmkf1b372sr4cefi92797
----->第二次請求:
請求報文:Cookie:PHPSESSID=ppqfhplmkf1b372sr4cefi92797
攜帶:
不再建立新的session檔案
將檔案中資料讀取到$_SESSION陣列中
8,Session資料的刪除
刪除單個數據
//開啟session 開啟檔案、讀取檔案資料至$_SESSION
session_start();
unset($_SESSION['name']);
刪除全部資料
//1開啟session 開啟檔案、讀取檔案資料至$_SESSION
session_start();
//2清空$_SESSION陣列
$_SESSION = array();
//3刪除客戶端Cookie中的sessionID 注: session_name()='PHPSESSID'
setcookie(session_name(),'',time()-10,'/');
//刪除伺服器中的session檔案
session_destory();
9,setcookie()和session_start()之前不能有輸出
setcookie()函式向瀏覽器設定cookie,由於Cookie是通過報文首部傳輸的,所以在函式前不允許有輸出,即報文主體內容。
session_start()函式將sessionID新增到響應首部。同上。