8.3 網頁狀態管理 - Cookie 與 Session

 

 

什麼是 Cookies 

cookies 是一種伺服器端程式用來將資料儲存在使用者端的技術 

目前瀏覽器均支援 cookies

 

 

Cookies 可以做什麼應用? 

一般在撰寫 CGI 程式時,必須使用 Set-Cookie 檔頭來建立 cookes,不過 PHP 提供了 setcookie() 函數可以幫我們輕鬆完成這項工作。 

 

setcookie 函數的原型: 

 

int setcookie(string name, string value, int expire, string path, string domain, int secure);由於 setcookie() 函數只是減輕我們撰寫檔頭的工作,所以 setcookie() 函數使用時和 header() 函數一樣,必須在沒有任何輸出之間呼叫,否則會發生錯誤。 

 

如果 PHP 程式是寫 HTML 裡,則 setcookie() 函數必須寫在 <HTML> 標籤之前 

 

setcookie 所接受的參數依序解釋如下: 

 

name

cookies 的名稱。 

 

value

cookies 的值,可以是字串或數字。 

 

expire

cookies 的到期時間,例如: 

 

setcookie("username", "Jollen", time()+3600);表示 username 這個 cookies 的到期時間為 time()+3600,也就是 1 小時後。 

 

path

設定 cookies 在伺服器端所屬的路徑。path 指定只有該目錄下的檔案與其子目錄可以讀取該 cookies 

 

domain

設定 cookies 所屬的網域名稱。指定網域名稱時,不用加上主機名稱,例如: 

 

setcookie("TestCookie",$value,time()+3600,"/~jollen/",".jollen.org",1);要特別注意,雖然沒有加上主機名稱,可是開頭的小數點不能省略。 

 

secure

指定 1 表示該 cookie 只有在 HTTPS 協定下才能傳送。 

 

 

 

 

 使用 Cookies 有哪些限制? 

 

所有的 cookies 會被存放於 $HTTP_COOKIE_VARS[] 陣列裡,我們也可以透過這個環境變數來取得 cookies 

例如: 

$fullname = $HTTP_COOKIE_VARS["fullname"]; 

同樣類型的 cookie 也可以建立成陣列的型式,以方便管理。 

<?php
$visits = $HTTP_COOKIE_VARS['visits'];
if (!isset($visits)) $visits = 1;
setcookie("visits", $visits+1);
?>
<p>歡迎您第 <?=$visits?> 次光臨!</p> 

我們再來看一個範例: 

<?php

if ($QUERY_STRING != 'SET') {
   setcookie("cookie", "COOKIES OK!");
   header("Location: $PHP_SELF?SET");
}

if ($cookie != 'COOKIES OK!') {

   header("Content-type: text/html");

   echo "<html>
         <head>
         </head>
         <body>
         <p>您的瀏覽器並不支援 Cookies !</p>
         </body>
         </html>";
} else {

   header("Content-type: text/html");

   echo "<html>
         <head>
         </head>
         <body>
         <p>您的瀏覽器可使用 Cookies !</p>
         </body>
         </html>";
}

?>
 

這個簡單的範例可以用來檢查使用者的瀏覽器是否支援 cookies 

 

 

 

 

 

 

 

 使用 Cookies 限制

使用者端最多可以同時擁有 300 cookies,同一個伺服器最多只能建立 20 cookies 給同一個使用者。 

每個 cookies 最大只能到 4K。在使用者瀏覽含有 cookies 的網頁時,瀏覽器會將 cookies 暫存於記憶體中,當瀏覽器結束執行後,所有尚未到期的 cookies 都會被儲存於 cookies.txt 的純文字檔裡,cookies.txt 最大只能到 1.2MB 

儲存到 cookies.txt 裡的 cookies 會等待在下次連線時使用。當使用者下次再瀏覽該網頁時,瀏覽器便會根據 path domain cookies 回傳給伺服器。

 

  

 

 

                                                 資料出處: http://www.jollen.org/php/

 

 

 

什麼是 Session 

 

session cookie 不同的地方在於,cookie 的資訊是儲存在使用者端 (client),但是session則是儲存在伺服器端 (server) 

事實上 session 如果沒有 cookie 也沒有辦法運作,但是我們知道,使用者端是否接受 cookie 可以在瀏覽器裡設定,因為使用者也可以拒絕接受 cookie。幸運的是,PHP 內建的 session 函數在沒有 cookie 場合下可以採取其它方法,因此還可以使用 session 

為什麼要使用 session 而不用 cookie 呢? 

1. 因為使用 session 將資用者資訊儲存在 server 端是比較安全的做法
2.
使用者關閉 cookie 的功能時,session 仍然可以運作 

 

 

 

PHP 要如何使用 session 

     

 

 

 

session 的使用必須經過啟動、註冊的程序,底下以步驟方式說明 session 的使用方法: 

 

 

1. 初始化 session 

session_start(); 

2. 註冊 session 

session_register("userID"); 

所謂的註冊 session 意思就是將變數的值保存到 session 裡。要特別注意這裡的寫法,要註冊的變數寫法是: 

session_register("userID"); (變數的名稱) 

這是錯誤的寫法: 

session_register($userID); 

3. 清除 session 

session_destroy(); 

當我們不再使用 session 時,可以呼叫session_destroy() 將所有已註冊的 session 清除。

 

 

 

 

 

 

 

關於 session 的生存期限 

大家可能會有一個疑問,那就是,只要使用者登入一次後,如果 server 端永遠保存 session 的內容,那使用者不就永遠不用登入了嗎?答案是:對的。 

但是事實上卻不是如此,因 session 並不是永遠都存在著,只要 session 一消失,程式讀不到 session 的內容,自然會再要求使用者登入。 

也就是說,session 有一個「生存期限」,當生存期限過了之後,session 自然會消失。那麼,session 在什麼情況下會消失呢?當底下幾種情況發生時,session 就會消失: 

1. 關閉瀏覽器並重新開啟後,session 就會消失
2. session
生存期限到時後,session 自動消失 

PHP 預設是將瀏覽器關閉並重新開啟後,session 就自行消失,也就是 session lifetime 0 

其實我們可以自己設定 session 的生存期限,當生存期限到期時,session 就會自動消失,而不管瀏覽器是不是被關閉並重新開啟。 

 

 

 

                                                      資料出處: http://www.jollen.org/php/