本文主要講解php回話機制cookie和session。
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變數顯示功能,請自行在本機測試;
設定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"); //设置路径与域
setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365);
header("Set-Cookie:cookie_name=value");
cookie的刪除與過期時間
透過前面的章節,我們了解了設定cookie的函數,但是我們卻發現php中沒有刪除Cookie的函數,在PHP中刪除cookie也是採用setcookie函數來實作。setcookie('test', '', time()-1);
header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));
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_start(); $_SESSION['ary'] = array('name' => 'jobs'); $_SESSION['obj'] = new stdClass(); var_dump($_SESSION);
刪除與銷毀session
刪除某個session值可以使用PHP的unset函數,刪除後就會從全域變數$_SESSION中移除,無法存取。session_start(); $_SESSION['name'] = 'jobs'; unset($_SESSION['name']); echo $_SESSION['name']; //提示name不存在
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中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。
$_SESSION['uid'] = $userinfo['uid']; $_SESSION['userinfo'] = $userinfo;
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。
以上是php會話技術主要包含哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!