PHP基礎教程十七之會話技術COOKIE、SESSION

來源:互聯網
上載者:User

前言

我們用PHP開發背景時候,需要對一些資料進行儲存,而我們通常的做法就是進行資料庫的儲存,但是有時候我們一些是不需要儲存在資料庫中的,比如我們在登入網頁的時候,在網站中顯示我們上一次訪問網站的時間,這個上一次訪問的時間就可以不用儲存在資料庫中,同時我們在登入某個網頁後,儲存的登入的使用者名稱,這些我們都可以不用儲存在資料庫中,而是使用PHP中的會話技術來解決。

會話的介紹

PHP的cookie技術和session技術都是針對會話來進行的。這裡的會話可以理解為當一個使用者開啟一個瀏覽器,訪問某個網站,從使用者訪問該網站開始,到使用者關閉訪問網站頁面結束,我們稱為一個會話。在一次會話過程中,使用者可以點擊該網站頁面的各個超連結,可以點擊多次。

當我們訪問一個網站和網站裡面的頁面,知道我們推出這個網站。就是一次會話。

cookie講解

我們有時候在訪問某個網站的時候,一進入網站就可以在網頁上看到我們上次訪問當前網站的時間是多少。這個時間就可以使用cookie進行進行儲存。

Cookie是用戶端技術,伺服器把每個使用者的資料以cookie的形式寫給使用者各自的瀏覽器。當使用者使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的資料去。這樣,web資源處理的就是使用者各自的資料了。注意cookie技術是寫在瀏覽器端的檔案。同時cookie的儲存方式是以索引值對的形式進行儲存的。

從上面的流程圖中可以看出來,在伺服器的PHP檔案中如果要建立cookie,則伺服器把建立cookie的資訊封裝到http協議的回應標頭中進行資訊的傳遞,瀏覽器接受到回應標頭後進行分析,知道了伺服器需要在瀏覽器建立一個cookie,通過回應標頭的資訊在本地建立一個cookie檔案,當瀏覽器再次訪問這個網站的時候會把本地的cookie資訊發送給伺服器。

Cookie:user=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6

cookie的使用

關於cookie的使用,可以簡單的理解為對cookie的增刪改查操作。

cookie的建立

建立cookie其實很簡單

<?php    //通過setcookie函數進行cookie的建立    setcookie('username','abc',time()+3600);

我們通過setcookie()函數進行cookie的建立,該cookie會儲存在瀏覽器的緩衝中。

Set-Cookie:username=abc; expires=Mon, 17-Oct-2016 08:55:51 GMT; Max-Age=3600
  • setcookie(參數1,參數2,參數3)我們在代碼中可以看到在這個函數中傳進去了三個參數,

    1. 第一個參數是儲存資訊的鍵的名字。

    2. 第二個參數是鍵對應的值

    3. 第三個參數是這個cookie儲存的時間,這裡儲存的時間是目前時間加上3600秒,當超過這個時間時,cookie將會失效。

當我們執行完上面的代碼我們可以在瀏覽器的快取檔案中看到建立的cookie的檔案,裡面有我們的儲存的資料。

usernameabcwww.lijiafei.com/test3/153621204704003055010048063876830550092*

cookie的讀取

在上面我們進行了資料的儲存,我們儲存資料的目的就是讀取資料,而cookie的讀取可以理解為:

  1. 當瀏覽器請求某個網站的頁面時,根據http協議規定: 該瀏覽器就會通過http的請求將該網站的cookie資訊發送給伺服器的請求頁面

  2. 伺服器接收到cookie資訊後,就會封裝到$_COOKIE數組中。

  3. 我們從$_COOKIE數組中進行讀取。

    <?php    echo '<pre>';    //自動封裝到這個數組裡面    var_dump($_COOKIE);    //通過鍵名取出值。    $username = $_COOKIE['username'];    echo $username;    ......結果.......    array(3) {      ["user"]=>      string(3) "abc"      ["username"]=>      string(3) "abc"      ["PHPSESSID"]=>      string(26) "v6ntsa42f4v0h5jpaoa1tot8r6"    }    abc

    當我們訪問檔案的時候,通過要求標頭把cookie資訊傳遞過去。

    Cookie:user=abc; username=abc; PHPSESSID=v6ntsa42f4v0h5jpaoa1tot8r6

cookie的修改

當我們想修改一個cookie的值的時候,仍然是使用setcookie來完成修改,但是如果cookie沒有存在,則建立,如果已經有了,則修改。

<?php//通過setcookie函數進行修改,但是如果瀏覽器沒有cookie則進行建立。setcookie('username','abc123',time() + 1600);

我們在進行讀取cookie的值可以看到成功的修改了裡面的值。

array(3) {  ["user"]=>  string(3) "abc"  ["username"]=>  string(6) "abc123"  ["PHPSESSID"]=>  string(26) "v6ntsa42f4v0h5jpaoa1tot8r6"}abc123

cookie的刪除,銷毀

當我們不行使用到cookie的時候,可以進行手動的銷毀cookie的值。
刪除cookie的資料可以理解為兩步,1、刪除儲存在瀏覽器緩衝的cookie檔案,2、刪除儲存在伺服器$_COOKIE數組中資料。

<?php    //使用setcookie這個函數進行刪除    setcookie('username','',time()-1);    //刪除儲存在$_COOKIE裡面的資料    if(isset($_COOKIE['username'])){        unset($_COOKIE['username']);    }    //刪除儲存在瀏覽器中這個網站的所有的cookie    foreach ($_COOKIE as $key => $value) {        setcookie($key,$value,time()-1);    }    //銷毀所有資料    unset($_COOKIE);

我們運行上面的代碼就可以刪除所有的cookie資訊。

cookie的深入理解

上面的就是cookie最基本的操作。但是我們還有許多需要注意的地方:

  1. 一個Cookie只能標識一種字串資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。就是說cookie 總是 名=值的形式儲存。

  2. 在預設的情況下,我們建立多個的cookie,將儲存在同一個檔案中.

  3. 一個WEB網站可以給一個瀏覽器發送多個Cookie,一個瀏覽器也可以儲存多個WEB網站提供的Cookie。

  4. 瀏覽器一般只允許存放300個Cookie, 每個網站最多存放20個,每個Cookie的大小限制在4K,但是不同的瀏覽器,情況可能不同。

  5. 如果建立了一個cookie,並將他發送到瀏覽器,預設情況下它是一個會話層級的cookie(即儲存在瀏覽器的記憶體中),使用者退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie儲存在磁碟上,則需要使用setcookie()函數的第三個參數設定時間,並給出一個以秒為單位的時間。要刪除 cookie 需要確保它的失效期是在過去,才能觸發瀏覽器的刪除機制。 就是說,我們的cookie預設的生命週期就是一個會話周期。如果希望設定,就需要 setcookie(‘name’, ‘val’, 時間)

  6. 如果希望cookie長久有效,可以這樣建立cookie setCookie(“key”,”val”,PHP_INT_MAX);

setcookie()函數

我們可以看到在操作cookie的時候,都是通過setcookie進行不同的設定,但是我們在查協助文檔的時候,可以看到setcookie的參數並不是三個,而是可以七個參數。

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

而我們上面使用的就是前三個參數,設定鍵和值,同時設定儲存的時間。

cookie有效路徑

在setcookie()函數中第四個參數是控制cookie的有效路徑的,當我們不設定的時候,預設的是當前路徑和後台路徑有效,但是當我們設定成’/’的時候,cookie全站有效。

案例目錄結構:

...test    |_readcookie.php(讀取cookie資訊)    |_abc        |_createcookie.php(建立cookie)        |_def            |_readcookie.php(讀取cookie);

兩個readcookie.php代碼一樣:

<?php    echo '<pre>';    var_dump($_COOKIE);

建立cookie的代碼:

<?php    //建立cookie儲存資料    setcookie('user','abc',time() + 1600,'');    //再建立一個cookie資訊,這兩個cookie會儲存在一個cookie檔案裡面    setcookie('password','123',time() + 1600,'/');

建立cookie的時候,第一個索引值使用預設的有效路徑第二個索引值使用全站的有效路徑。
當訪問test目錄下的readcookie.php檔案時,只能顯示password-123的索引值資訊。

array(1) {  ["password"]=>  string(3) "123"}

cookie網域名稱共用

我們在開發中可能出現在一個網站(www.test.com)下面有兩個域(www.a.test.com,www.b.test.com)名,如果我們不對cookie進行設定,這兩個網域名稱是不能互相訪問對方的cookie的,但是如果我們對cookie進行設定,就可以實現網域名稱共用。而setcookie()的第五個參數就是控制網域名稱共用的。

<?php    //設定第五個參數表示兩個網域名稱可以共用cookie資料。    setcookie('username','abc','','','.test.com');

cookie安全傳輸

在我們在瀏覽網頁的時候,大多數使用的的協議是HTTP協議,但是還有一種協議是HTTPs協議,這種協議比http協議更加安全,在開發中有時候當我們需要對某些重要的cookie資料必須在https協議下才能被傳輸,這是就會用到setcookie()函數的第六個參數進行設定。

<?php//第五個參數設定為false表示可以在http協議和https協議下傳輸。setcookie('username','abc','','','',false);//第五個參數設定為false表示只能在https協議下傳輸。setcookie('password','123','','','',true);

cookie的httponly

在預設情況下,cookie值是可以被其他指令碼擷取的,比如是JavaScript,這是就可能存在安全問題,那我們怎麼防止其他指令碼來讀取cookie呢?

在setcookie()函數的最後一個參數就是控制cookie只能http協議進行讀取。

<?php//最後一個參數,設定為true表示只能是https協議進行讀取。setcookie('username','abc','','','',false,false);

上面的就是對會話技術cookie的介紹。在會話技術中還有之中技術也就是session。

session講解

在我們登入網頁時,輸入正確的帳號和密碼後,我們可以使用會話技術的session技術進行儲存資料。
Session是伺服器端技術,利用這個技術,伺服器在運行時可以為每一個使用者的瀏覽器建立一個其獨享的session檔案,由於session為使用者瀏覽器獨享,所以使用者在訪問伺服器的web資源時,可以把各自的資料放在各自的session中,當使用者再去訪問伺服器中的其它web資源時,其它web資源再從使用者各自的session中取出資料為使用者服務

當我們在伺服器需要建立一個session的時候,會在伺服器建立一個session檔案,並且每個會話獨享一份session檔案,在伺服器session檔案預設存在在 c:/windows/temp 目錄, 但是我們也可以在php.ini中進行修改。當伺服器建立session後,會在返回資料的時候把session的id號封裝到http協議的回應標頭中。

SetCookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70; path=/

這個響應資訊和建立cookie的資訊很想,但是瀏覽器並不會在瀏覽器的緩衝中建立cookie檔案。當瀏覽器儲存住session的ID後,如果又要訪問網頁,瀏覽器會把session的ID封裝在要求標頭中發送給伺服器。

Cookie:PHPSESSID=58j6c68qo6fhn31qrmt6bbrv70

session操作

session的操作大致也可以分為增刪改查四個步驟。
但是不管是什麼操作都需要在操作前開啟session機制,使用sessio_start()函數進行開啟。同時session資料的儲存也是通過索引值對的方式進行儲存的。session儲存的資料類型可以是int,float,boolean,string,array,object。

session的建立

<?php    //開啟session機制    session_start();    //把資料儲存在$_SESSION數組裡面。    $_SESSION['user'] = 'abc';

先開啟session機制,然後把需要的資料儲存在$_SESSION數組裡面當我們運行代碼可以在http協議的回應標頭中添加了一段話:

Set-Cookie:PHPSESSID=p4lsn4vrdjtmkou1qc3tn3n577; path=/

同時我們也可以參看我們在伺服器儲存的session檔案。

user|s:3:"abc";

session的讀取

<?php    //先開啟session機制    session_start();    echo '<pre>';    //儲存在session裡面的資料會自動封裝到$_SESSION數組裡面    var_dump($_SESSION);    ......結果......    array(1) {      ["user"]=>      string(3) "abc"    }

當我們讀取session的資料的時候,先開啟session機制,這樣伺服器就會把session檔案裡面的資料封裝到$_SESSION數組中,從而就可以對資料進行操作。

session的修改

session的修改和cookie的修改是一樣的,session怎麼建立,就怎麼修改,如果資料不存在就建立,如果資料存在就修改。

session的刪除

當我們不需要某些session資料的時候,我們可以進行資料的刪除,當然,我們可以刪除一個資料,也可以刪除全部資料,甚至也可以刪除session檔案。

<?php    session_start();    // if(isset($_SESSION['user'])){    //  //刪除其中一個資料    //  unset($_SESSION['user']);    // }    // //通過迴圈刪除全部的資料。    // foreach ($_SESSION as $key => $value) {    //  unset($_SESSION[$key]);    // }    //刪除session檔案    session_destroy();

我們可以根據自己的需求進行不同資料的刪除。

從上面的講解中可以看到操作session的函數並不像cookie一樣只是一個函數,關於session的操作函數有許多。

session的深入瞭解

session啟動方式

在上面我們都是使用了session_start()函數來啟動session機制,其實PHP給我們提供了兩種方式來開啟session

  1. 直接在php檔案中使用session_start()函數;這種方式比較靈活,推薦使用這種方式。

  2. 直接在php.ini 檔案中,配置session.auto_start = 1 設定1就可以自動開啟session機制. 預設情況下這個值是 0,這種方式不推薦使用。

session的安全設定

關於session的安全和cookie的安全設定一樣,但是session不是通過函數的參數進行設定的,而是在php.ini檔案中進行配置的。其中有幾個關鍵的值:

  • session.save_path:session資料儲存在伺服器的路徑。

  • session.cookie_secure:這個參數的作用和cookie很像,在傳輸給伺服器時,是否安全傳輸,即是否使用https傳輸。

  • session.cookie_httponly:只能http協議進行讀取。

  • session.cookie_domain:在傳輸給伺服器時,有效網域名稱的設定。

上面的參數我們都是直接在php.ini配置裡面修改的,這種修改是永久性的,但有時我們要求只是臨時的修改php.ini檔案,就可以使用ini_set()函數進行配置。ini_set函數可以去臨時修改php.ini 的設定,而且設定只對當前的這個會話有影響。但是有一點ini_set函數要在 session_start()前,才會生效.

session的儲存機制

在上面我們在使用session的時候,只是簡單的進行session_start()函數開啟session機制,並且把資料封裝到$_SESSION數組裡面,但是我們並沒有瞭解其中的過程,資料是怎麼儲存在數組裡面,又是在什麼時候儲存在session檔案中的,當destroy掉session檔案的時候又是在哪裡進行執行的,都沒有瞭解。

session的儲存機制大致可以分為三步,從session_start開始,到一個檔案運行結束

在session_start()開啟session機制後,

  1. 判斷瀏覽器傳過來的資料中是否帶有session_id,如果有就使用,沒有就建立一個session檔案。

  2. 將session檔案中的資料讀取到$_SESSION數組中。

  3. 啟用session的記憶體回收機制,判斷哪些session是失效的,刪除失效的session檔案。

在指令碼周期內,我們可以對$_SESSION數組進行增刪改查的操作,注意在這裡操作的資料並不會對儲存在伺服器端的session檔案有影響。同時如果在這裡使用session_destroy(),就會刪除session檔案並關閉session機制。

在指令碼結束時,先判斷session機制是否關閉,如果沒有關閉就會把$_SESSION數組裡面的資料寫入session檔案。

上面就是session的儲存機制,理解並掌握儲存機制,對我們使用session有很好的協助。

session的GC

在上面的儲存機制中我們知道在開啟session機制後第一步中通過判斷哪些是無效的檔案,然後session會啟用記憶體回收機制(GC)進行回收,但是並不是每此開啟都要進行回收的,其實在php.ini檔案中有兩個參數,設定了啟用gc的機率。

  1. session.gc_probability

  2. session.gc_pisor= 10000

它們是一對,表示記憶體回收的機率是多少,而機率的計算公式是session.gc_probability/ session.gc_pisor = 1/10000, 就是說,當調用10000次session_start() 函數,有一次會觸發記憶體回收機制。

但是針對不同的網站我們設定不同的機率,對於大型網站,session.gc_pisor 設定大點,比如10000, 中型網站 500-1000, 小網站, 200-300,避免頻繁的觸發GC。

總結

會話技術cookie和session在PHP開發中用到的還是很多的,理解兩個技術不同的特點,讓我們在開發中更加靈活的儲存不同的資料。

以上就是PHP基礎教程十七之會話技術COOKIE、SESSION的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.