php對話控制(session&cookie)

來源:互聯網
上載者:User
php會話控制(session&cookie)

cookie簡介

Cookie是儲存在用戶端瀏覽器中的資料,我們通過Cookie來跟蹤與儲存使用者資料。一般情況下,Cookie通過HTTP headers從服務端返回到用戶端。多數web程式都支援Cookie的操作,因為Cookie是存在於HTTP的標題之中,所以必須在其他資訊輸出以前進行設定,類似於header函數的使用限制。

PHP通過setcookie函數進行Cookie的設定,任何從瀏覽器發回的Cookie,PHP都會自動的將他儲存在$_COOKIE的全域變數之中,因此我們可以通過$_COOKIE['key']的形式來讀取某個Cookie值。

PHP中的Cookie具有非常廣泛的使用,經常用來儲存使用者的登入資訊,購物車等,且在使用會話Session時通常使用Cookie來儲存會話id來識別使用者,Cookie具備有效期間,當有效期間結束之後,Cookie會自動的從用戶端刪除。同時為了進行安全控制,Cookie還可以設定域跟路徑,我們會在稍後的章節中詳細的講解他們。

設定cookie

PHP設定Cookie最常用的方法就是使用setcookie函數,setcookie具有7個選擇性參數,我們常用到的為前5個:

name( Cookie名)可以通過$_COOKIE['name'] 進行訪問
value(Cookie的值)
expire(到期時間)Unix時間戳記格式,預設為0,表示瀏覽器關閉即失效
path(有效路徑)如果路徑設定為'/',則整個網站都有效
domain(有效域)預設整個網域名稱都有效,如果設定了'www.imooc.com',則只在www子域中有效

$value = 'test';setcookie("TestCookie", $value);setcookie("TestCookie", $value, time()+3600);  //有效期間一小時setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //設定路徑與域

PHP中還有一個設定Cookie的函數setrawcookie,setrawcookie跟setcookie基本一樣,唯一的不同就是value值不會自動的進行urlencode,因此在需要的時候要手動的進行urlencode。

setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365); 

因為Cookie是通過HTTP標題進行設定的,所以也可以直接使用header方法進行設定。

header("Set-Cookie:cookie_name=value");

cookie的刪除與到期時間

通過前面的章節,我們瞭解了設定cookie的函數,但是我們卻發現php中沒有刪除Cookie的函數,在PHP中刪除cookie也是採用setcookie函數來實現。

setcookie('test', '', time()-1); 

可以看到將cookie的到期時間設定到目前時間之前,則該cookie會自動失效,也就達到了刪除cookie的目的。之所以這麼設計是因為cookie是通過HTTP的標題來傳遞的,用戶端根據服務端返回的Set-Cookie段來進行cookie的設定,如果刪除cookie需要使用新的Del-Cookie來實現,則HTTP頭就會變得複雜,實際上僅通過Set-Cookie就可以簡單明了的實現Cookie的設定、更新與刪除。

瞭解原理以後,我們也可以直接通過header來刪除cookie。

header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));

這裡用到了gmdate,用來產生格林威治標準時間,以便排除時差的影響。

cookie的有效路徑

cookie中的路徑用來控制設定的cookie在哪個路徑下有效,預設為'/',在所有路徑下都有,當設定了其他路徑之後,則只在設定的路徑以及子路徑下有效,例如:

setcookie('test', time(), 0, '/path');

上面的設定會使test在/path以及子路徑/path/abc下都有效,但是在根目錄下就讀取不到test的cookie值。

一般情況下,大多是使用所有路徑的,只有在極少數有特殊需求的時候,會設定路徑,這種情況下只在指定的路徑中才會傳遞cookie值,可以節省資料的傳輸,增強安全性以及提高效能。

當我們設定了有效路徑的時候,不在當前路徑的時候則看不到當前cookie。

setcookie('test', '1',0, '/path');  var_dump($_COOKIE['test']);  

session與cookie的異同

cookie將資料存放區在用戶端,建立起使用者與伺服器之間的聯絡,通常可以解決很多問題,但是cookie仍然具有一些局限:

cookie相對不是太安全,容易被盜用導致cookie欺騙
單個cookie的值最大隻能儲存4k
每次請求都要進行網路傳輸,佔用頻寬

session是將使用者的會話資料存放區在服務端,沒有大小限制,通過一個session_id進行使用者識別,PHP預設情況下session id是通過cookie來儲存的,因此從某種程度上來說,seesion依賴於cookie。但這不是絕對的,session id也可以通過參數來實現,只要能將session id傳遞到服務端進行識別的機制都可以使用session。

使用session

在PHP中使用session非常簡單,先執行session_start方法開啟session,然後通過全域變數$_SESSION進行session的讀寫。

session_start();$_SESSION['test'] = time();var_dump($_SESSION);

session會自動的對要設定的值進行encode與decode,因此session可以支援任意資料類型,包括資料與對象等。

session_start();$_SESSION['ary'] = array('name' => 'jobs');$_SESSION['obj'] = new stdClass();var_dump($_SESSION);

預設情況下,session是以檔案形式儲存在伺服器上的,因此當一個頁面開啟了session之後,會獨佔這個session檔案,這樣會導致目前使用者的其他並發訪問無法執行而等待。可以採用緩衝或者資料庫的形式儲存來解決這個問題。

刪除與銷毀session

刪除某個session值可以使用PHP的unset函數,刪除後就會從全域變數$_SESSION中去除,無法訪問。

session_start();$_SESSION['name'] = 'jobs';unset($_SESSION['name']);echo $_SESSION['name']; //提示name不存在

如果要刪除所有的session,可以使用session_destroy函數銷毀當前session,session_destroy會刪除所有資料,但是session_id仍然存在。

session_start();$_SESSION['name'] = 'jobs';$_SESSION['time'] = time();session_destroy();

值得注意的是,session_destroy並不會立即的銷毀全域變數$_SESSION中的值,只有當下次再訪問的時候,$_SESSION才為空白,因此如果需要立即銷毀$_SESSION,可以使用unset函數。

session_start();$_SESSION['name'] = 'jobs';$_SESSION['time'] = time();unset($_SESSION);session_destroy(); var_dump($_SESSION); //此時已為空白

如果需要同時銷毀cookie中的session_id,通常在使用者退出的時候可能會用到,則還需要顯式的調用setcookie方法刪除session_id的cookie值。

使用session來儲存使用者的登入資訊

session可以用來儲存多種類型的資料,因此具有很多的用途,常用來儲存使用者的登入資訊,購物車資料,或者一些臨時使用的暫存資料等。

使用者在登入成功以後,通常可以將使用者的資訊儲存在session中,一般的會單獨的將一些重要的欄位單獨儲存,然後所有的使用者資訊隔離儲存區 (Isolated Storage)。

$_SESSION['uid'] = $userinfo['uid'];$_SESSION['userinfo'] = $userinfo;

一般來說,登入資訊既可以儲存在sessioin中,也可以儲存在cookie中,他們之間的差別在於session可以方便的存取多種資料類型,而cookie只支援字串類型,同時對於一些安全性比較高的資料,cookie需要進行格式化與加密儲存,而session儲存在服務端則安全性較高。

session_start();
//假設使用者登入成功獲得了以下使用者資料
$userinfo = array(
'uid' => 10000,
'name' => 'spark',
'email' => [email protected]',
'sex' => 'man',
'age' => '18'
);
header("content-type:text/html; charset=utf-8");


/* 將使用者資訊儲存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
echo "welcome ".$_SESSION['name'] . '
';


//* 將使用者資料儲存到cookie中的一個簡單方法 */
$secureKey = 'imooc'; //加密金鑰
$str = serialize($userinfo); //將使用者資訊序列化
echo "使用者資訊加密前:".$str;
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secureKey, $str, MCRYPT_MODE_ECB));
echo "使用者資訊加密後:".$str;
//將加密後的使用者資料存放區到cookie中
setcookie('userinfo', $str);


//當需要使用時進行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secureKey, base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密後的使用者資訊:
";
var_dump($uinfo);


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.