php中的會話機制(1)

①什麼是會話機制:

這個太過抽象,也挺複雜的,只能說一下本身的理解。在b/s架構下,會話機制,其實就是服務器(server)和瀏覽器(browser)之間的對話的一種方式!這種對話方式,可以使得web站點可以對用戶的行爲進行追蹤,在同一個站點下用戶所需的數據實現共享!php

②爲何要使用會話機制

歸根究竟是因爲,b/s的訪問方式是基於http協議的,而http協議自己又是無狀態的,所謂無狀態,就是指服務器端沒法區分發起請求的是不是同一我的(有興趣的同窗能夠本身好好研究一下http的無狀態性)!每次請求都會被當作獨立的請求,並不能將兩次訪問聯繫到一塊兒!html

③核心設計思想

核心設計思想:容許服務器對同一個客戶端的的連續請求進行跟蹤,對同一個訪問者的請求數據,在多個頁面之間實現共享!jquery

④php中實現會話機制的方法:

1)在兩個頁面(較少頁面之間)經過$_GET或者$_POST數組之間實現數據的共享!
2)使用cookie將用戶的信息存放在客戶端的計算機中,用於保存並不重要的數據
3)經過session將用戶的信息保存在服務器中web

經過$_GET和$_POST方式得到數據較爲簡單,這裏就再也不介紹!跨域


cookie會話機制實現的注意點

1)當咱們經過setCookie()函數來新增或者改變cookie中的值的時候,setCookie()函數前面不可以有任何實際的輸出,即便是空格也不能夠!
這是由於setCookie()函數最終是改變http響應頭信息咱們有理由相信setCookie()方法,底層就是經過header()方法進行的設置的頭信息,咱們都應該知道在header函數前面是不可以有任何實際的輸出的(除非是開啓了ob緩存)!數組

2)在cookie中是隻可以保存字符串的,可是,若是咱們想將一個數組變量保存到cookie中,在不進行序列化的狀況下,其實也是能夠辦到的,代碼以下:瀏覽器

<?php
$expires = time()+3600;
setcookie('user["name"]["xing"]','liang');
setcookie('user["name"]["ming"]', 'bo');

setcookie('user["age"]', '23', $expires);
setcookie('user["addr"]','吉林', $expires);
?>

<?php
$name = $_COOKIE['name'];
var_dump($name);
?>

> 獲得的結果以下:
>     array(3) {
>       [""name""]=>
>           array(2) {
>             [""xing""]=>
>             string(5) "liang"
>             [""ming""]=>
>             string(2) "bo"
>           }
>       [""age""]=>
>       string(2) "23"
>       [""addr""]=>
>       string(6) "吉林"
>     }

3)cookie的$path參數,只有在指定的路徑下的網頁才能夠獲取cookie中的值!demo以下:緩存

<?php
if(!$_COOKIE['name']) {
$expires = time()+3600;
setcookie('name','liangbo', $expires, '/talkphp/secondtalk/');
}
?>

該頁面所處的路徑"/",也就是網站的根目錄!服務器

接受的代碼以下:cookie

<?php
    header('Content-type:text/html;charset=utf-8');
    $name = $_COOKIE['user'];
    var_dump($name);
?>

改代碼文件所在的路徑以下:/talkphp/secondtalk/
執行結果以下:string(7) "liangbo"

一樣的接受代碼:可是所處的路徑不一樣,是在根目錄「/」下,
獲得的結果以下:null

4)cookie的跨域問題:
我的認爲跨域問題,主要是值存在同一個網站下,有多個二級域名,在多個二級域名下cookie數據的共享問題!
在cookie中,若是設置的domain參數是一級域名的話,那麼cookie中的數據在各個二級域名之間是均可用的!demo以下:

<?php
if(!$_COOKIE['name']) {
$expires = time()+3600;
setcookie('name','liangbo', $expires, '/talkphp/secondtalk/', '.test.com');
}
?>

<?php
    $name = $_COOKIE['name'];
    var_dump($name);
?>

該代碼所在的網站域名是:php.test.com 頁面路徑是:/talkphp/secondtalk/getcookie.php
運行結果以下:string(7) "liangbo"

一樣的代碼,該代碼所在的域名是:jquery.test.com 頁面所在的路徑是:/talkphp/secondtalk/getcookie.php
運行結果以下:string(7) "liangbo"
可見,若是domain參數中設置的是一級域名的話,那麼在各個二級域名之間$_COOKIE中的數據是能夠共享的
在一級域名中.test.com,中test前的"."實際上是能夠省略的,可是加上的話,瀏覽器的兼容會更好!

咱們來看另一種狀況:

<?php
if(!$_COOKIE['name']) {
$expires = time()+3600;
setcookie('name','liangbo', $expires, '/talkphp/secondtalk/','php.test.com');
}
?>

這裏,咱們將domain設置爲了二級域名php.test.com

<?php
    $name = $_COOKIE['name'];
    var_dump($name);
?>

該代碼所在的網站域名是:php.test.com 頁面路徑是:/talkphp/secondtalk/getcookie.php
運行結果以下:string(7) "liangbo"

一樣的代碼,該代碼所在的域名是:jquery.test.com 頁面所在的路徑是:/talkphp/secondtalk/getcookie.php
運行的結果以下:null
可見,若是設置的domain參數是二級域名的話,那麼cookie中的數據只可以在該二級域名下面使用!

相關文章
相關標籤/搜索