發現有不少朋友一直誤覺得Session和$_SESSION,Cookie和$_COOKIE是對等的,特地寫了一篇文章討論一下他們之間的關係,省得在面試中掉坑以及在項目中出錯php
上述代碼會產生怎麼樣的結果?面試
a.php: //報notice級別錯誤[echo $_COOKIE[‘a’]服務器
這個頁面的值不難,將會報出一個notice( Undefined index: a)錯誤,由於Cookie的返回值具備慢一拍特性,在頁面中設置setcookie後,當客戶端第一次訪問時,須要把Cookie鍵值對包含在http響應頭返 回給客戶端,當你下次訪問的時候,客戶端會着這份具備Cookie值的請求頭請求服務器,服務器進行一系列判斷(包括對Cookie值範圍,Cookie有效期),也就知道當前的客戶端存在這一份Cookie值,調用顯示出來,而後再用 到其餘業務邏輯.。cookie
b.php: //abcsession
這個頁面的值是abc,其實第一次看到這個答案我也很驚訝,感受上Cookie值不是在A頁面被unset掉了嗎?怎麼還會有呢?函數
其實原理是這樣的:spa
咱們一直對Cookie/Session,$_COOKIE /$_SESSION混爲一談了,其實呢,這四個(兩組)是獨立開來的,Cookie/Session是屬於http協議裏的值,$_COOKIE /$_SESSION是屬於php裏面的全局變量.咱們在setcookie的時候,實際上給http協議中的Cookie賦值,而http中的Cookie 與php中的超全局變量$_COOKIE自動關聯上(注意只是關聯上,相似傳值賦值的關係).因此$_COOKIE纔有這個值abc,並非直接將值賦給$_COOKIE超全局變量上的.因此一樣道 理,unset($_COOKIE)銷燬的是$_COOKIE這個變量,與http頭中的Cookie值無關(壓根沒有影響到),因此在b.php依舊能夠打印出來(再輸出時$_COOKIE[‘a’]依舊從http協議的Cookie拷貝值)。code
解決辦法就是 setcookie(a,」,-1)將這個Cookie設置爲過時,那麼b.php就不能再獲取到了.blog
————————————分割線————————————–it
相似的道理也能夠用到Session機制裏,
在這幅圖裏,最終仍是可以打印出$_SESSION的值,由於Session_destroy將http中的Session和超全局變量$_SESSION的關係分離了,而且銷燬當前Session_id對應的Session值,詳見手冊
Session_destroy 是把Session和$_SESSION之間的關係割開了,若是你想從新恢復Session函數功能,你就要從新打開session_start(),;例以下圖,
Session_unset和普通unset是一個道理,但操做的是HTTP協議中的Session值,可看手冊
這樣子Session值就會被順利刪掉,那麼與它關聯的$_SESSION超全局變量值也就消失了
總結:
session_unset銷燬的不是$_SESSION這個變量值,而是http中的Session值.具體能夠本身分別開啓與不開啓session_start而後session_unset進行實驗 unset這個函數不一樣,unset直接操做變量,Cookie和$_COOKIE是傳值賦值關係 session_destroy的做用是將SESSION與$_SESSION之間的聯繫切除掉 $_SESSION/Session值,$_COOKIE/Cookie值不是對等的,cookie/Session操做着$_COOKIE/$_SESSION變量值,因此在進行函數操做的時候必定要搞明白,他到底是對變量操做仍是http協議操做! 讓Cookie過時最好的策略是將它過時而不是unset.