在很多時候,我們需要跟蹤瀏覽者在整個網站的活動,對他們身份進行自動或半自動的識別(也就是平時常說的網站登陸之類的功能),這時候,我們常採用一組變數來“追隨”訪客。實現變數“追隨”有很多種方法,比較用得多的是cookie和session。下面我們用時下很流行的PHP為大家講解一下它們的使用。
一.Cookie的使用
Cookie是網站儲存在瀏覽器用戶端的資訊,也就是說儲存在訪客的機器裡的變數,一般隨著HTTP頭髮送到用戶端。在Cookie生效之後及失效之前,客戶每次發出頁面請求的時候,都會把Cookie一塊發送到伺服器,只要我們針對它進行相應的處理,就可以實現變數“追隨”。
1. 設定一個Cookie變數
設定一個Cookie變數,PHP使用的函數是:
int setcookie(string name, string value, int expire, string path, string domain, int secure);
其中name是Cookie變數名稱標識,你在PHP中將可以象使用普通變數名一樣來用它引用Cookie變數。value是Cookie變數的初始值,expire 表示該Cookie變數的有效時間;path 為該Cookie變數的相關路徑;domain 表示Cookie變數的網站;secure 則需在 https 的安全傳輸時才有效。
例如我們要設定一個變數username,它的值是字串“bluewind”,我們可以這麼寫代碼:
setcookie (“username”,“bluewind”); //這兩個參數是setcookie必要的。
我們還想給這個變數設定有效時間來限制操作逾時等,比如說10分鐘:
setcookie (“username”,“bluewind”, 600000); //有效時間的單位是毫秒。
注意:setcookie和header函數一樣,需要放在任何能向用戶端輸出的語句之前。
2. 銷毀一個變數
銷毀Cookie變數只要將它的value設為空白(“”)就可以了,如想銷毀上面那個變數只要再寫一次:
setcookie (“username” ,“”);
就可以了。這常用作安全退出之用。
3. Cookie的有效範圍和生存期
Cookie的有效範圍(也就是說在這個範圍的頁面都能得到這個Cookie變數)預設的是該目錄及其子目錄,當然你可以用setcookie的path和domain參數進行修改。如果你不對cookie的expire進行設定(參見1. 設定一個Cookie變數中的例子),那麼當你離開網站的頁面,cookie也同時得到自動銷毀。
http://www.netscape.com/newsref/std/cookie_spec.html是 cookie 原創者 Netscape 所提供的完整介紹資訊。
二,session的使用
session變數,也就是會話級變數,是訪客在整個和網站互動的過程中都存在的公有變數。在用戶端不支援有可能不支援cookie的時候(比如linux下的lynx……呵呵,慘了點),我們為了保證資料正確安全,就需要採用session變數。Session在各種網頁語言中的實現方式不一樣,PHP在4.0後也開始支援它了。首先,讓我們來看看一個簡單的例子:
test.php ----------- <?session_start(); session_register(var); //註冊變數var$var="這是SESSION變數的值"; //var變數已經被作為session變數 ?>test1.php ------ <?session_start(); session_register(var); echo $var; //輸出:“這是SESSION變數的值”?>
1、初始一個session
如果PHP的設定自動session並沒有開啟的話,需要使用session_start()函數來初始化一個session,這個函數的用法如下:
: boolean session_start(void);
它的作用是初始化一個新的 Session,若該客戶已在 Session 之中,則連上原 Session。本函數沒有參數,且傳回值均為 true。
2、在session中註冊一個變數
你要在session儲存的變數都必須使用下列函數對變數進行註冊:
boolean session_register(string name);
本函數在全域變數中增加一個變數到目前的 Session 之中。參數 name 即為欲加入的變數名。成功則返回true 值。
然後你就可以直接使用變數名對它進行賦值,這個值就會被儲存下來。
3、使用session變數的值
如上例所示,只要你再在新的頁面重複上兩個步驟(除了賦值外),就可以直接使用session變數。
4、session的銷毀
如果你只是想登出一個變數而不是摧毀整個變數的話,那需要使用函數:
boolean session_unregister(string name);
用法很簡單,參數 name 即為欲刪除的變數名。成功則返回 true 值。
但是,如果要整個“摧毀”session變數的話,比如說安全退出什麼的,使用函數:
boolean session_destroy(void);
本函數結束目前的 Session。本函數沒有參數,且傳回值均為 true。
5、其它有用的session函數
a、 檢查變數是否註冊
boolean session_is_registered(string name);
本函數可檢查目前的 Session 之中是否已有指定的變數註冊。參數 name 即為欲檢查的變數名。成功則返回true 值。
b、 給註冊變數歸null
void session_unset(void);
這個函數可以把當然註冊的所有的session變數置為空白。注意它不是unregister,也不同於destroy。 下面這個例子,對此函數做了很好的說明。
<?php session_register('a','b','c'); //auto-session-start $a=1; $b=2; $c=3; session_unregister('a'); //unregistrered $a echo "A: $a - reg:".session_is_registered('a')." ";// but the global $a remains session_unset(); // unsets $b und $c echo "B:$b - reg:".session_is_registered('b')." "; // the registration remains ! echo "C:$c - reg:".session_is_registered('c')." "; echo session_encode(); ?> 輸出: A: 1 - reg: B: - reg:1 C: - reg:1 !b|!c|
c、定製你自己的session處理方法
void session_set_save_handler (string open, string close, string read, string write, string destroy, string gc)
這個函數可以定義使用者級的session的儲存函數(開啟、關閉、寫入等)。比如,我們想把session儲存在本地的一個資料庫中時,本函數就很有用了。預設情況下,每個session存貯在系統臨時目錄的一個個獨立檔案中(例如在unix系統中為/tmp)。這適合或不適合,依你的需求而言。例如:如果你的支援php的web伺服器分布在不同的機器上,你不能很容易地共用它們之間的session(當然,你也可以將sessions儲存在NFS共用中)。另一個潛在的問題是你機器上的數千或數百萬個session檔案使你的檔案系統變得散亂 。注意:這個函數是在4.0b4版本後才出現的。使用本函數前,先要配置php.ini檔案,session.save_hadler=user ,否則,session_set_save_handler()不會生效。
此外,根據我的測試,你如果想讓這樣的session跨頁面使用,還要在每一個用到session的指令檔中加入你自定的函數及session_set_save_handler,所以,最好的方法是做成一個單獨的檔案,在每一個要用到session的指令碼中用include來包含進來。
下面這個例子提供了一個最基本的session儲存法,類似於預設的files方法。如果你想用資料庫來實現,這也是很容易做到的。
Example:session_set_save_handler() example <?php function open ($save_path, $session_name) { global $sess_save_path, $sess_session_name; $sess_save_path = $save_path; $sess_session_name = $session_name; return(true); } function close() { return(true); } function read ($id) { global $sess_save_path, $sess_session_name; $sess_file = "$sess_save_path/sess_$id"; if ($fp = @fopen($sess_file, "r")) { $sess_data = fread($fp, filesize($sess_file)); return($sess_data); } else { return(""); } } function write ($id, $sess_data) { global $sess_save_path, $sess_session_name; $sess_file = "$sess_save_path/sess_$id"; if ($fp = @fopen($sess_file, "w")) { return(fwrite($fp, $sess_data)); } else { return(false); } } function destroy ($id) { global $sess_save_path, $sess_session_name; $sess_file = "$sess_save_path/sess_$id"; return(@unlink($sess_file)); } /********************************************* * WARNING - You will need to implement some * * * sort of garbage collection routine here. * * *********************************************/ function gc ($maxlifetime) { return true; } session_set_save_handler ("open", "close", "read", "write", "destroy", "gc"); session_start(); // proceed to use sessions normally // 現在你就可以象往常一樣地使用session了。 ?>