1. 程式人生 > >簡述cookie和session的區別及各自的工作機制,存儲位置等,簡述cookie的優缺點 全

簡述cookie和session的區別及各自的工作機制,存儲位置等,簡述cookie的優缺點 全

拼接 調用 login 文件包含 為什麽 如果 信息保存 當前 redis

為什麽要使用會話控制技術?
web是通過http協議來是實現的,http是無狀態的協議,http沒有一個內建機制來維護兩個事務之間的狀態,所以在同一個用戶訪問一個頁面兩次的時候,http協議不會認為這兩次請求都來自同一個用戶,會把他們當成兩次請求的獨立,會將這兩次請求隔離開(不同的兩個人過來請求),如果用戶執行了登錄之後呢,就會判斷出這是同一個用戶,

最簡單的方式:通過GET參數傳遞,比如我在1這個頁面進行一個登錄,登錄完之後,用戶的登錄信息我有了,跳到2頁面的時候,繼續把用戶信息傳過去,通過GET傳參,問題:信息不安全,參數丟失,信息就丟失了.

cookie
由服務器發送給客戶端的片段信息,在存儲在客戶端瀏覽器的內存,或者是硬盤當中的技術

存儲在瀏覽器上的一個文件,這個文件包含客戶 端的一些片段信息,單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

cookie操作
設置 :setcookie($name,$value,$expire,$path,$domian,$secure); 鍵 值 過期時間 路徑 域名 安全性https傳遞
讀取:$_COOKIE
設置數組:setcookie(‘a[b]‘,‘val‘);
刪除cookie值:unset($_COOKIE);//不可以使用unset刪除這個cookie
       setcookie($name,‘‘,time()-1);//將它過期,即刪除

優點:不占用我們服務器資源。不浪費服務器資源,效率會高一些
缺點:信息全部保存在客戶端計算機,所以不建議將一些敏感重要的數據和信息保存在cookie當中,而且用戶是有權限禁用cookie的使用,如果我們在瀏覽器將cookie禁止掉,我們沒有辦法保存我們的用戶信息了。

session

將使用者相同的用戶資料保存在服務器當中的,這樣用戶沒有辦法禁用掉session的使用,session並不是完全脫離cookie的,是基於cookie的;

eg:
用戶(客戶端)-》會員卡(只是電子卡,用戶說身份證號就能使用)-》超市(服務器端)
身份證號就是session id ,這個是存儲在cookie中的,cookie被禁用,可以通過URL來傳遞session id,保存一個session的狀態,session的信息全部保存在服務器端文件中,當用戶想要讀取裏邊的內容時,首先會使用瀏覽器攜帶的session id的cookie去找到對應的那個session文件,進行讀取。


session操作:
開啟:session_start();
讀取:$_SESSION;
數組:$_SESSION=[];
刪除:session session_destroy();
配置session:
session.auto_start 是否自動開啟session
session.cookie_domian 存儲session id那個cookie他有效域名是什麽
session.cookie_lifestyle
session.cookie_path
session.name 默認PHPSESSION
session.save_path session文件在服務器中存在那個路徑下
session.use_cookies 是否使用cookie傳遞我們是session id
session.use_trans_sid 是否使用trans傳遞我們是session id

(每100次調用session_start時,進行1次清除文件,當前時間的時間戳加-文件最後修改的時間>1440s)
session.gc_probability =1 垃圾回收機制
session.gc_divisor =100 //每訪問一百次,有一次清除的機會
session.gc_maxlifetime =1440 (默認)//最大生命周期 ,
(一般的這三者配合去使用,做一個垃圾回收機制,用戶直接關閉瀏覽器,不退出,會永久的保存在服務器中,使用垃圾回收,定時清除一些session文件,最大生命周期,過期,清除掉)

session.save_handler(緩存)

優點:存儲在服務器端,數據信息安全;
缺點:占用服務器資源,分布式也是一個問題,n臺web服務器,session存在其中一臺,另外一臺是無法使用的,使用redis,不管在那臺,直接調用redis服務器,信息可以進行共享。

傳遞SessionID問題:
session_name()和session_id();
<a herf=‘1.php‘?<?php echo session_name().‘=‘.session_id?>下一個頁面</a>
<a herf=‘1.php‘?<?php echo SID;?>下一個頁面</a>開啟了cookie 這個SID就是空,沒有開啟cookie或者cookie被禁用掉,此時SID才是這個字符串的拼接,所以說提示比較智能的。


session儲存
假如存在5臺web服務器

  1     2     3     4     5
session

login

           lvs


用戶在第一臺服務器上進行了一個login,將session文件存儲在第一臺web服務器上邊,
當用戶在進行其他操作的時候,剛好輪詢到其他的服務器上,沒有session文件,用戶登錄的一個狀態就丟失了

所以不要再存在文件中了,存在內存服務器或者數據庫裏面,例如redis,memcache,mysql

              redis
            session

    1     2     3     4     5


              lvs
直接調用redis服務器,獲取信息

使用session_set_save_handler()

Session信息的存儲方式,如何進行遍歷?
默認存儲在服務器文件中,還可以存儲在數據庫,內存,遍歷$_session[]

簡述cookie和session的區別及各自的工作機制,存儲位置等,簡述cookie的優缺點 全