PHP面試 PHP基礎知識 八(會話控制)

---恢復內容開始---php

PHP會話控制技術

  首先了解一下爲何要使用會話控制技術?

  自己web 與服務器的交互是經過HTTP協議來實現的,而HTTP協議又是無狀態協議。就是說明HTTP協議沒有一個內建機制來維護web與服務器之間的狀態。因此同一個用戶請求同一個頁面兩次的時候,HTTP協議不會認爲這兩次請求來自同一個web,會把這兩次請求隔離開。會認爲是兩個不一樣的用戶來請求的。若是這個用戶執行了登錄操做,再次請求頁面。HTTP協議不會認爲該用戶作過登錄操做。由於HTTP協議沒法保留登錄狀態,沒法在不一樣頁面之間進行跟蹤和狀態保持。會話控制就是保留用戶的狀態,用來跟蹤和對用戶的狀態保持。html

  cookie和session

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

  就是存儲在瀏覽器當中的一個文件web

  cookie的優勢和缺點redis

  優勢:cookie存儲在客戶端,不會佔用服務器端的資源。sql

  缺點:也是存儲在客戶端,不建議將一些敏感重要的數據保存到cookie當中。並且用戶有權限在瀏覽器禁止cookie的使用,一旦用戶禁止cookie沒法保存用戶信息。跨域

  cookie的不可跨域名性瀏覽器

  不可跨域名性是什麼意思呢?目前不少網站都會使用cookie,好比客戶端說訪問A網站,A網站會給客戶端頒發一個cookie。客戶端訪問B網站,B網站也會給客戶端頒發一個cookie。那麼客戶端訪問B網站會不會帶着A網站的cookie?B網站可不能夠修改A網站頒發給客戶端的cookie呢?安全

  答案確定是不能夠的。cookie具備不可跨域名性,根據cookie的規範,客戶端訪問B網站只會攜帶B網站頒發的cookie,從而B網站只能操做B網站頒發的cookie,不能修改A網站的cookie。服務器

  cookie是客戶端瀏覽器來管理的,瀏覽器能保證B只操做B不會操做A,從而保證用戶的隱私安全。

  瀏覽器又是怎麼管理的呢?

  瀏覽器判斷一個網站可否操做另外一個網站的cookie是根據域名,A網站和B網站的域名不一樣,因此B不能修改A的cookie。

cookie的操做

存儲cookie
setcookie(name,value,expire,path,domain,secure)
參數
    name     鍵名
    value     存儲的cookie值
    expire    cookie過時時間
    path       規定的cookie服務器路徑
    domain   規定cookie的域名
    secure    是否經過HTTP傳輸cookie

讀取cookie

$_COOKIE

刪除cookie

setcookie(name,'',time()-1000);

  session是存在服務器的一種用來存放用戶數據的類hashtable結構。

  當瀏覽器向服務器發送第一次請求的時候。服務器會生成一個hashtable和一個sessionid,sessionid用來標識hashtable,服務器返回瀏覽器的時候會把sessionid一塊兒返回。第二次瀏覽器請求的時候會攜帶第一次的sessionid,服務器根據sessionid來查找相匹配的hashtable.

  session的優勢和缺點

  優勢:安全性高      缺點:佔用服務器資源。

  推薦一個詳解cookie和session的博客:http://www.javashuo.com/article/p-ryxhflmu-cq.html

使用session   首先開啓session

session_start()

操做session

$_SESSION;   這裏不詳細介紹    能夠參考百度

清除session

$_SESSION = [];

session_distory();   刪除session文件並把sessionid刪除

session相關配置

session.auto_start   session是否自動開啓
session.cookie_domain   session的有效域名
session.cookie_lifetime   session存儲在cookie的最大生命週期
session.cookie_path     session存儲在cookie的路徑
session.name    cookie存儲sessionid的鍵名
session.save_path  session存儲在服務器的路徑
session.use_cookies 是否使用cookie傳遞sessionid
session.use_trans_id  是否可使用鏈接傳遞sessionid

session垃圾回收機制
session.gc_probability    清理次數
session.gc_divisor          請求次數
session.gc_maxlifetime   最大生命週期  超過生命週期 視爲垃圾

到達訪問次數  就會清理一次垃圾

session.save_handle   session存儲方式   如:mysql  redis  memcache
  cookie 和session的區別

  一、cookie保存在客戶端,服務器能夠知道其中的信息。session存儲在服務器端,客戶端不知道其中的信息。

  二、session保存的是對象,cookie保存的是字符串。

  三、session不能區分路徑,在同一個網站下在全部地方均可以訪問到session,若是cookie設置了路徑,那麼同一個網站下不一樣路徑的cookie互相是不能訪問的。

  cookie與session的聯繫

  session是依賴於cookie才能正常工做,若是用戶在客戶端禁用了cookie那麼session也將失效。

  爲何cookie禁用session也失效?

  由於session在客戶端也須要保存一個惟一標識(就是sessionid),那麼就須要用到cookie,sessionid是存在cookie當中的,使用$_COOKIE['PHPSESSID']能夠獲取sessionid,因此禁掉cookie,session也不能使用。

  禁用cookie後如何傳遞sessionid值?

  一、能夠修改配置

    session.use_cookies = 0;設置客戶端不用cookie保存sessionid值

    session.use_only_cookies = 1;  是否只使用cookie傳遞sessionid

    session.use_trans_sid = 1;  url自動加上PHPSESSID  這樣session正常使用

  二、使用url傳遞sessionid 

    <a href="indx.php?<?php echo session_name(). '=' .session_id();?>"></a>

    SID常量在禁用cookie的時候就是session_name和session_id的拼接,不然就是null

    <a href="indx.php?<?php echo SID;?>"></a>

相關文章
相關標籤/搜索