COOKIE介紹
cookie 常用于識别使用者。cookie 是伺服器留在使用者計算機中的小檔案。每當相同的計算機通過浏覽器請求頁面時,它同時會發送 cookie。通過 PHP,您能夠建立并取回 cookie 的值。
1、設定Cookie
PHP用SetCookie函數來設定Cookie。
SetCookie函數定義了一個Cookie,并且把它附加在HTTP頭的後面,SetCookie函數的原型如下:
int SetCookie(string name, string value, int expire, string path, string domain, int secure);
參數說明:cookie名稱,cookie值,過期時間(int),有效路徑,有限域名,https傳遞才有效
注意:目前設定的Cookie不是立即生效的,而是要等到下一個頁面時才能看到.這是由于在設定的這個頁面裡Cookie由伺服器傳遞給客戶浏覽器,在下一個頁面浏覽器才能把Cookie從客戶的機器裡取出傳回伺服器的原因。
使用例子:
普通使用:
setcookie('name','PHP淮北');
帶失效時間的:
setcookie('name','PHP淮北',time()+24*60*60);//1day
Cookie是面向路徑的 ,預設存儲在目前檔案下,如果沒有設定路徑,不同檔案下的cookie預設儲存在不同檔案夾下,如圖:預設儲存在mytest檔案夾下

2、接收和處理Cookie
使用者端與服務端的web通信協定是http。而PHP通過http取得使用者資料慣用的三種方法分别是:POST方法、GET方法還有Cookie。而PHP預設傳遞方法正是Cookie,也是最佳方法。
比如設定一個名為MyCookier的Cookie,PHP會自動從WEB伺服器接收的HTTP頭裡把它分析出來,并形成一個與普通變量一樣的變量,名為$myCookie,這個變量的值就是Cookie的值
3,删除Cookie
要删除一個已經存在的Cookie,有兩個辦法:
- 一是調用隻帶有name參數的SetCookie,那麼名為這個name的Cookie将被從關系戶機上删掉;例如:setcookie('name','');
-
另一個辦法是設定Cookie的失效時間為time()或time()-1,那麼這個Cookie在這個頁面的浏覽完之後就被删除了(其實是失效了)。 例如:setcookie('name','PHP淮北',time()-24*60*60);
要注意的是,當一個Cookie被删除時,它的值在目前頁在仍然有效的。
使用Cookie的注意事項:
-
- 首先是必須在HTML檔案的内容輸出之前設定(Cookie是HTTP協定頭的一部分,用于浏覽器和伺服器之間傳遞資訊,是以必須在任何屬于HTML檔案本身的内容輸出之前調用Cookie函數。
在PHP頁面可以先使用
ob_start();//開啟
code…..
ob_end_flush(); //重新整理緩存
可以防止header提示錯誤);
- 不同的浏覽器對Cookie的處理機制不一樣
- cookie限制是在用戶端的。一個浏覽器能建立的Cookie數量最多為30個,并且每個不能超過4KB,每個WEB站點能設定的Cookie總數不能超過20個。
- 目前設定的Cookie不是立即生效的,而是要等到下一個頁面時才能看到
Session介紹
session機制是一種伺服器端的機制,伺服器使用一種類似于散清單的結構(也可能就是使用散清單)來儲存資訊,每一個網站訪客都會被配置設定給一個唯一的标志符,即會話ID,它的存放形式無非兩種:要麼經過url傳遞,要麼儲存在用戶端的Cookies裡.當然,你也可以将Session儲存到資料庫裡,這樣會更安全,但效率方面會有所下降.url方式傳遞安全性肯定太差,PHP的會話機制是通過設定Cookie,在Cookie中儲存會話id(Session ID),在伺服器端會生成session檔案,與使用者進行關聯,Web應用程式存儲與這些Session相關的資料,并在各頁面間進行傳遞.
PHP相關函數
在PHP中有關Session的函數比較多,不過我們最常用到的也就這麼幾個函數:
session_start():啟用session機制,在需要用到session的程式檔案的最開始調用它.
session_register():注冊session變量
session_unregister(): 删除session變量(一個一個删除)
session_is_registered(): 判斷session變量是否注冊
session_distroy(): 銷毀所有session變量(所有session變量銷毀,包括檔案)
需要注意下面幾個方面:
1.函數session_start()必須在程式最開始執行,在其前面不能有任何輸出内容,否則
就會出現“Warning:Cannot send session cookie - headers already
sent"類似這樣的警告資訊.
2.函數session_register()用于注冊要儲存在session中的相關變量,其用法如下:
<?php
$val = "session value";
session_register("val");
?>
val即為要注冊的session變量名,在注冊時一定不要加上"$"符号,隻寫其變量名稱即可.
3.函數session_unregister()與上面函數用法完全相同,但功能相反,上面函數是注冊
session變量,而其則是删除指定的session變量.
4.函數session_is_registered()用于判斷session變量是否注冊.
5.函數session_destroy()主要用于在系統登出和退出時,銷毀所有的session變量,它沒有參數,直接調用即可。
Session與PHP.ini的關系配置
1,session.save_handler = file
用于讀取/回寫session資料的方式,預設是files。它會讓PHP的session管理函數使用指定的文本檔案存儲session資料
2,session.save_path = “/xammp/temp/”
指定儲存session檔案的目錄,可以指定到别的目錄,但是指定目錄必須要有httpd守護程序屬主(比如apache或www等)寫權限,否則無法回存session資料。它還可以寫成這樣session.save_path = “N;/path” 其中N是整數。這樣使得不是所有的session檔案都儲存在同一個目錄中,而是分散在不同目錄。這對于伺服器處理大量session檔案是很有幫助的。(注:目錄需要自己手工建立)
3,session.auto_start = 0
如果啟用該選項,使用者的每次請求都會初始化session。不推薦使用,最好通過session_start()顯示地初始化session。
上圖:左側是儲存在xammp/tmp/下的session檔案,内容是PHP序列化的格式
右側:第一行是echo serialize($_SESSION['name']);//序列化
第二行是列印session值
*****************其中檔案名是session-name,内容是PHP序列化的格式
cookie與session的差別和關系
-
存儲位置:
-
- session存儲在伺服器位置上,可以通過php.ini裡面配置session相關配置
- cookie存儲在用戶端上的上(其實可以分兩種:
1,持久性cookie,設定了cookie的時間,以檔案方式存在硬碟上,
2,會話cookie,沒有設定cookie時間,cookie的生命周期也就是關閉浏覽器前就消失,一般不會儲存在硬碟,而是儲存在記憶體上)
cookie和session的關系
從上面的圖可以看到:
cookie通過http報頭發送:
Cookie
name=PHP%BB%B4%B1%B1; PHPSESSID=cpt2ah3pi4cu7lo69nfbfllbo7
其中PHPSESSID就是關聯伺服器session的重要參數
再看session檔案:sess_cpt2ah3pi4cu7lo69nfbfllbo7
session_id的生成格式就是:sess_加上一串PHPSESSID的值
我們可以這樣了解:
當程式需要為某個用戶端的請求建立一個session時,伺服器首先檢查這個用戶端的請求裡是否已包含了一個session辨別 (稱為session id),如果已包含則說明以前已經為此用戶端建立過session,伺服器就按照session id把這個session檢索出來 使用(檢索不到,會建立一個),如果用戶端請求不包含session id,則為此用戶端建立一個session并且生成一個與此session相 關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字元串,這個session id将被在本次響應 中傳回給用戶端儲存。儲存這個session id的方式可以采用cookie,這樣在互動過程中浏覽器可以自動的按照規則把這個辨別發送給 伺服器。一般這個cookie的名字都是類似于SEEESIONID
php.ini裡面關于session和cookie有關的配置
1,session.use_cookie = 1
是否采用Cookie方法傳遞session id值。預設是1,表示啟用。
2,session.name = PHPSESSID
不管是Cookie傳遞sessioin_id,還是GET方法傳遞session_id,都需要使用鍵值。他們的格式分别是Cookie: sess_name=session_id;和/path.php?sess_name=session_id,其中sess_name就是由這裡指定的。
3,session.use_only_cookies = 0
表示隻使用Cookie 的方法傳遞session id。我們說過,傳遞cookie的方法,除了cookie,還有GET方法,GET方法是不安全的方法。在使用者端禁用了cookie的時候,會采用GET方法傳遞session_id,可以通過這個設定盡用GET方法傳遞session_id。
4,session.cookie_lifetime = 0, session.cookie_path = / 以及session.cookie_domain =
如果使用Cookie方法傳遞session_id的話,這裡分别指定了cookie有效域、目錄和時間。分别對應setcookie()函數的形參$expire、$path和$domain。其中cookie_lifetime=0表示直到關閉浏覽器才删除Cookie。還可以使用session_set_cookie_params()函數修改這些值。
5,session_name([string $name])
擷取或更新session_name。如果傳了name,則表示不使用預設的名稱PHPSESSID(由session.name)指定,否則擷取目前session_name。注意:如果設定session_name,則必須在session_start()之前調用才生效。
6,session_id([string $id])
與session_name()類似,但它是讀取或者設定session_id的方法。同樣,設定session_id的話,必須在session_start()之前調用才有效。
7,session_set_cookie_params()和session_get_cookie_params()
通過session_set_cookie_params()可以重新設定session.cookie_lifetime, session.cookie_path以及session.cookie_domain這三個php.ini設定。而session_get_cookie_params()則是擷取這些設定的值。
總結:
- 服務端session的相對于用戶端的cookie安全性要較高一點
- session在伺服器叢集的時候容易不同步,而cookie不會
ps:下午關于使用cookie退出出現的問題
當退出的時候使用:
setcookie('username','',time()-3600);
setcookie('name','',time()-3600);
理論上cookie應該正常清除,測試的時候發現第一登入退出完全正常,但是再次登入就是退出不了,cookie始終存在,很是郁悶,使用firebug檢視原來頁面設定了緩存,使用nginx設定了頁面緩存,原因也就是找到了。
由于設定了緩存,本地用戶端不能及時向向伺服器申請資訊,cookie還是讀取本地用戶端的,使用php header設定header報頭 不設定cache ,問題解決,代碼可以參看:《網站優化--讓你的網頁飛起來》
相關資料:http://www.360doc.com/content/06/0503/12/73_109481.shtml#
http://www.perfgeeks.com/?p=183
http://www.perfgeeks.com/?p=232
http://www.webgamei.com/article.php?id=75&PHPSESSID=d226cc07cec0580ec7dad47119ee4667
http://hi.baidu.com/hasiz/blog/item/8bab0cf4e02f246cdcc474c9.html
Technorati 标簽: php session cookie 差別 關系