為什么要使用會話控制技術
HTTP協議是無狀態的,也就是說HTTP沒有一個內建的機制來維護兩個事務之間的狀態。當一個用戶完成一個請求發起第二個請求的時候,服務器無法知道這次請求是來自于上一次的客戶。而用戶登錄、購物車等,這些是需要服務器能夠保存用戶的狀態的。會話技術就是用來完成這件事的。其思想是允許服務器跟蹤客戶端做出的連續請求。
會話控制技術的實現方式
通過GET參數傳遞
在get里面把狀態傳遞到下一頁
使用get參數傳遞不安全而且不穩定,不建議使用
Cookie
Cookie本質上是服務器發送給客戶端的片段信息,存儲在客戶端瀏覽器的內存或者是硬盤中的技術。
- Cookie的寫入操作
setcookie($name,$value,$expire,$path,$domain,$secure)
- 讀取Cookie
$_COOKIE
數組 - 刪除Cookie
刪除cookie不能使用unset,因為$_COOKIE是只讀的。要想刪除,只需要讓其過期就就行:setcookie($name,'',time()-1000)
- Cookie的優缺點
- 優點:存儲在客戶端,不會占用服務器的資源
- 缺點:信息保存在客戶端,安全性得不到保障,而且用戶可以關閉cookie。
- 優點:存儲在客戶端,不會占用服務器的資源
Session
Session將數據保存在服務器上,相比cookie更加安全。
session并不是完全脫離cookie,他是基于cookie的(需要將sessionid保存在客戶端,如果cookie被禁用,可以通過url來傳遞sessionid)
- session 的操作
session_start();//要使用之前一定要開啟
- 然后直接操作
$_SESSION
數組 - 要刪除,直接賦空數組:
$_SESSION = [];
- 如果想刪除文件,則使用
session_destroy();//同時會刪除對應session的cookie
- session 配置(php.ini)
- session.auto_start
- session.cookie_domain
- session.cookie_lifetime
- session.cookie_path
- session.name
- session.save_path
- session.use_cookies
- session.use_trans_sid
- session.gc_probability
- session.gc_divisor
- session.gc_maxlifetime
- session.save_handler
- session的優缺點
- 優點:信息安全
- 缺點:占用服務器的資源,分布式不方便
- 優點:信息安全
- 傳遞sessionid
如果cookie被禁用,那么可以通過get來傳遞sessionid:
"xxx.php?<?php echo session_name().'='.session_id(); ?>"//通過session_name()和session_id()來拼接"xxx.php?<?php echo SID; ?>"//SID常量在cookie開啟的時候為空,在cookie被禁用的時候是session_name()和session_id()拼接的樣子
session 的存儲
session_set_save_handler()
函數可以將session存儲在服務器上(mysql Memcache redis等)