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子網域中有效
PHP中還有一個設定Cookie的函式setrawcookie,setrawcookie跟setcookie基本上一樣,唯一的差異就是value值不會自動的進行urlencode,因此在需要的時候要手動的進行urlencode。
因為Cookie是透過HTTP標頭進行設定的,所以也可以直接使用header方法來設定。
cookie的刪除與過期時間
透過前面的章節,我們了解了設定cookie的函數,但是我們卻發現php中沒有刪除Cookie的函數,在PHP中刪除cookie也是採用setcookie函數來實現。
可以看到將cookie的過期時間設定到當前時間之前,則該cookie會自動失效,也就達到了刪除cookie的目的。之所以這麼設計是因為cookie是透過HTTP的標頭來傳遞的,客戶端根據服務端返回的Set-Cookie段來進行cookie的設置,如果刪除cookie需要使用新的Del-Cookie來實現,則HTTP頭就會變得複雜,實際上僅透過Set-Cookie就可以簡單明了的實作Cookie的設定、更新與刪除。
了解原理以後,我們也可以直接透過header來刪除cookie。
這裡用到了gmdate,用來產生格林威治標準時間,以便排除時差的影響。
cookie的有效路徑
cookie中的路徑用來控制設定的cookie在哪個路徑下有效,預設為'/',在所有路徑下都有,當設定了其他路徑之後,則只在設定的路徑以及子路徑下有效,例如:
上面的設定會使test在/path以及子路徑/path/abc下都有效,但是在根目錄下就讀取不到test的cookie值。
一般情況下,大多是使用所有路徑的,只有在極少數有特殊需求的時候,會設定路徑,這種情況下只在指定的路徑中才會傳遞cookie值,可以節省資料的傳輸,增強安全性以及提高性能。
當我們設定了有效路徑的時候,不在目前路徑的時候則看不到目前cookie。
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会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,包括数据与对象等。
默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题。
删除与销毁session
删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问。
如果要删除所有的session,可以使用session_destroy函数销毁当前session,session_destroy会删除所有数据,但是session_id仍然存在。
值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。
如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的调用setcookie方法删除session_id的cookie值。
使用session来存储用户的登录信息
session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。
用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。
session_start();版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了php会话控制session&cookie,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。