由於session_start()函數調用的時候,實際上是經過setCookie()函數向cookie中設置了
PHPSESSID這個key,對應的value是一個隨機的、惟一的32位字符串! 而setCookie前面是不能夠有任何實際的輸出的!php注意:這裏的PHPSESSID名字是在php.ini文件中進行的配置!配置以下圖所示:ajax
①若是session機制是基於cookie的,那麼當腳本第一次運行的時候
A、 在客戶端上session_start()函數會經過setCookie()函數向Cookie中保留一個key,默認狀況下Key的名字是PHPSESSID,對應的值是一個32位的、惟一的、隨機的字符串!
B、 在服務器端,會產生一個以PHPSESSID的value值爲名字的文件!其中保留的是session中的數據!同時,在腳本中建立$_SESSION超全局數組,並將session文件的數據反序列化,添加到$_SESSION數組中!segmentfault②當腳本第二次,及之後運行的時候
A、 瀏覽器端會自動攜帶COOKIE中的PHPSESSID對應的value值,將數據送至服務器端!
B、在服務器端,一旦開啓sessioin_start()的時候,會根據客戶端提供的sessionid去尋找對應的session文件,將session中的變量讀取出來!在腳本中建立$_SESSION超全局數組,將數據定義到$_SESSION數組中!數組注意:$_SESION數組數組只有在調用session_start()函數以後,更確切確切的說,是開啓session機制以後]纔會存在!之因此這樣說,是因爲session_start()時,會先獲得session_id,經過session_id找到對應的文件內容,而後進行反序列化!若是,咱們接着使用session_id()函數來滯空session_id的話,咱們就找不到session中的內容了!
同時,$_SESSION是超全局定義數組,他和常量同樣,並無做用域的概念!幾乎在哪裏均可以使用!瀏覽器
接下來,咱們來看一點代碼!當咱們第一次運行這個腳本,腳本代碼以下 腳本A中的代碼:服務器
<?php session_start(); $_SESSION['name']='maweibin'; ?>
在服務器端保存session文件夾中的的文件入下:cookie
代碼中的保值至以下:session
在客戶端保存了一個cookie文件,內容以下:dom
經過觀察咱們能夠發現:PHPSESSIONID對應的value值和服務器端session文件的文件名是一致的!函數
當第二次及其之後運行這個腳本的時候,在服務器端,並無什麼變化
在客戶端,發起http請求的時候,咱們能夠看到:
請求的時候會字段的將cookie中的PHPSESSID帶到服務器端!服務器端,會經過提供的sessionid值,將session文件中的數據讀取出來!
<?php session_start(); $name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省'); $_SESSION['voice'] = $name; ?> <?php session_start(); var_dump($_SESSION['voice']); ?>
運行的結果以下:
array(3) { ["name"]=> string(3) "jay" ["age"]=> string(2) "23" ["addr"]=> string(9) "吉林省" }
注意:這裏咱們有必要討論一下,爲何cookie中不能存放數組之類的變量,而只可以存放字符串!咱們來看幾段代碼:
<?php session_start(); $name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省'); $_SESSION['voice'] = $name; ?> 在session文件中存儲的數據以下: name|s:8:"maweibin";voice|a:3:{s:4:"name";s:3:"jay";s:3:"age";s:2:"23";s:4:"addr";s:9:"吉林省";} <?php $expires = time()+3600; $name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省'); setcookie('name',$name, $expires, '/talkphp/secondtalk/', 'php.test.com'); ?> 此時,咱們調用一下這段腳本: <?php $name = $_COOKIE['name']; var_dump($name); 獲得的結果是null,因而可知這樣的寫法是不支持的! ?> 咱們再看一段代碼: <?php $expires = time()+3600; setcookie('person["name"]','liangbo' , $expires, '/talkphp/secondtalk/', 'php.test.com'); setcookie('person["age"]','23' , $expires, '/talkphp/secondtalk/','php.test.com'); ?> 運行結果以下: array(2) { [""name""]=> string(7) "liangbo" [""age""]=> string(2) "23" }
雖然也取到了數據,可是,cookie中的數據卻和session中的數據並不相同!可是,咱們來看一下cookie文件中存儲的數據
person["name"]
liangbo
php.test.com/talkphp/secondtalk/
0
976582400
30365600
3634030379
30365591
person["age"]
23
php.test.com/talkphp/secondtalk/
0
976582400
30365600
3634060380
30365591
因而可知,cookie之因此不可以保存數組或者是對象等變量,是由於cookie自己並無序列化,和反序列化這一步!這也提示咱們,若是,咱們手動將將變量進行了序列化和反序列化,就能夠用cookie來存儲變量了!
咱們可使用unset()方法幹掉$_SESSION[‘key’] ,這樣能夠單獨的幹掉一個值,此時$_SESSION數組依然存在!
可是,若是咱們須要清空session中的所有數據的時候,是不可以直接unset($_SESSION)。這樣在當前腳本週期以內,超全局定義數組$_SESSION 就不存在了!咱們也就沒有辦法操做session中的數據了!
咱們來看一段代碼: <?php var_dump($_SESSION); session_start(); var_dump($_SESSION); unset($_SESSION); session_start(); var_dump($_SESSION); ?> 運行以下: NULL array(0) { } NULL
從上面的代碼中,咱們至少能夠得出兩個結論:
① 開啓session機制前,$_SESSION數組是不存在的!
② $_SESSION 數組在腳本週期內,一旦被幹掉,就不會再產生!即便從新開始session機制以後,該數組也並無出現!
所以,咱們想要清空$_SESSION 中的數據的話,就須要使用$_SESSION = array()的形式,這樣可以在腳本週期以內,保證$_SESSION數組的存在!
有的時候,咱們須要對cookie中的值進行重寫!若是,後面並無跟路徑名、域名、過時時間的話,簡單的進行重寫就能夠了!
可是,若是cookie中保存了這些參數,而咱們從新設定值的時候,並無設置相關參數,這些參數還會被完整保留下來麼?仍是沒有了?看代碼:
<?php //文件路徑: /talkphp.php $expires = time()+3600; setcookie('name','liangbo' , $expires); 運行結果以下圖 ?>
<?php //文件路徑: /secondtalk/se setcookie('name','maweibin'); ?>
<?php $name = $_COOKIE['name']; echo $name; ?>
從上面的代碼中,咱們能夠得出如下結論:
①原有cookie中保存的值,是否被後來的cookie值是否被覆蓋取決於,兩個參數:
(1)path路徑
若是在同一個域名,可是不一樣的路徑下,設置了同名的cookie,那麼該域名下回保存兩個cookie,依據路徑的不一樣,選擇使用哪個cookie(由於cookie中的key相同,那麼只能依靠path路徑進行區分!)
(2)domain域名。很明顯,不一樣域名下的cookie確定是兩個,同名的話,也不衝突
②若是在同一個域名、同一個路徑下,設置了同名的cookie,那麼後面的cookie值會覆蓋前面的值!
path路徑、過時時間、所在域名都以最後一個cookie的爲準!若是,該cookie並無設置這些參數,那麼cookie會話機制,會進行自動的填充!
path路徑,以當前的運行腳本路徑爲準! 過時時間,就是一個會話週期,瀏覽器關閉後,就消失! domain域名,就是url中的域名!
通過試驗證實,凡是從瀏覽器端發起的請求,在訪問同一個域名的時候,cookie是會被自動攜帶到服務器端的,不管是經過url訪問、仍是經過ajax調用訪問cookie都是會被自動攜帶的! 注意:只有是從客戶端發起的請求,cookie纔會被自動攜帶!