本文主要講解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"); //设置路径与域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,用來產生格林威治標準時間,以便排除時差的影響。
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中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。
$_SESSION['uid'] = $userinfo['uid']; $_SESSION['userinfo'] = $userinfo;
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。
以上是php會話技術主要包含哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!