在很多時(shí)候,我們需要跟蹤瀏覽者在整個(gè)網(wǎng)站的活動(dòng),對他們身份進(jìn)行自動(dòng)或半自動(dòng)的識(shí)別(也就是平時(shí)常說的網(wǎng)站登陸之類的功能),這時(shí)候,我們常采用一組變量來“追隨”訪客。實(shí)現(xiàn)變量“追隨”有很多種方法,比較用得多的是cookie和session。下面我們用時(shí)下很流行的php為大家講解一下它們的使用。
一.cookie的使用
cookie是網(wǎng)站保存在瀏覽器客戶端的信息,也就是說保存在訪客的機(jī)器里的變量,一般隨著http頭發(fā)送到客戶端。在cookie生效之后及失效之前,客戶每次發(fā)出頁面請求的時(shí)候,都會(huì)把cookie一塊發(fā)送到服務(wù)器,只要我們針對它進(jìn)行相應(yīng)的處理,就可以實(shí)現(xiàn)變量“追隨”。
1. 設(shè)置一個(gè)cookie變量
設(shè)置一個(gè)cookie變量,php使用的函數(shù)是:
int setcookie(string name, string value, int expire, string path, string domain, int secure);其中name是cookie變量名稱標(biāo)識(shí),你在php中將可以象使用普通變量名一樣來用它引用cookie變量。value是cookie變量的初始值,expire 表示該cookie變量的有效時(shí)間;path 為該cookie變量的相關(guān)路徑;domain 表示cookie變量的網(wǎng)站;secure 則需在 https 的安全傳輸時(shí)才有效。
例如我們要設(shè)置一個(gè)變量username,它的值是字符串“bluewind”,我們可以這么寫代碼:
setcookie (“username”,“bluewind”); //這兩個(gè)參數(shù)是setcookie必要的。我們還想給這個(gè)變量設(shè)置有效時(shí)間來限制操作超時(shí)等,比如說10分鐘:
setcookie (“username”,“bluewind”, 600000); //有效時(shí)間的單位是毫秒。注意:setcookie和header函數(shù)一樣,需要放在任何能向客戶端輸出的語句之前。
2. 銷毀一個(gè)變量
銷毀cookie變量只要將它的value設(shè)為空(“”)就可以了,如想銷毀上面那個(gè)變量只要再寫一次:
setcookie (“username” ,“”);就可以了。這常用作安全退出之用。
3. cookie的有效范圍和生存期
cookie的有效范圍(也就是說在這個(gè)范圍的頁面都能得到這個(gè)cookie變量)默認(rèn)的是該目錄及其子目錄,當(dāng)然你可以用setcookie的path和domain參數(shù)進(jìn)行修改。如果你不對cookie的expire進(jìn)行設(shè)置(參見1. 設(shè)置一個(gè)cookie變量中的例子),那么當(dāng)你離開網(wǎng)站的頁面,cookie也同時(shí)得到自動(dòng)銷毀。
http://www.netscape.com/newsref/std/cookie_spec.html是 cookie 原創(chuàng)者 netscape 所提供的完整介紹信息。
二,session的使用
session變量,也就是會(huì)話級(jí)變量,是訪客在整個(gè)和網(wǎng)站交互的過程中都存在的公有變量。在客戶端不支持有可能不支持cookie的時(shí)候(比如linux下的lynx……呵呵,慘了點(diǎn)),我們?yōu)榱吮WC數(shù)據(jù)正確安全,就需要采用session變量。session在各種網(wǎng)頁語言中的實(shí)現(xiàn)方式不一樣,php在4.0后也開始支持它了。首先,讓我們來看看一個(gè)簡單的例子:
test.php ----------- <?session_start(); session_register(var); //注冊變量var$var="這是session變量的值"; //var變量已經(jīng)被作為session變量 ?>test1.php ------ <?session_start(); session_register(var); echo $var; //輸出:“這是session變量的值”?>1、初始一個(gè)session
如果php的設(shè)置自動(dòng)session并沒有開啟的話,需要使用session_start()函數(shù)來初始化一個(gè)session,這個(gè)函數(shù)的用法如下:
: boolean session_start(void);它的作用是初始化一個(gè)新的 session,若該客戶已在 session 之中,則連上原 session。本函數(shù)沒有參數(shù),且返回值均為 true。
2、在session中注冊一個(gè)變量
你要在session保存的變量都必須使用下列函數(shù)對變量進(jìn)行注冊:
boolean session_register(string name);本函數(shù)在全局變量中增加一個(gè)變量到目前的 session 之中。參數(shù) name 即為欲加入的變量名。成功則返回true 值。
然后你就可以直接使用變量名對它進(jìn)行賦值,這個(gè)值就會(huì)被保存下來。
3、使用session變量的值
如上例所示,只要你再在新的頁面重復(fù)上兩個(gè)步驟(除了賦值外),就可以直接使用session變量。
4、session的銷毀
如果你只是想注銷一個(gè)變量而不是摧毀整個(gè)變量的話,那需要使用函數(shù):
boolean session_unregister(string name);用法很簡單,參數(shù) name 即為欲刪除的變量名。成功則返回 true 值。
但是,如果要整個(gè)“摧毀”session變量的話,比如說安全退出什么的,使用函數(shù):
boolean session_destroy(void);本函數(shù)結(jié)束目前的 session。本函數(shù)沒有參數(shù),且返回值均為 true。
5、其它有用的session函數(shù)
a、 檢查變量是否注冊
boolean session_is_registered(string name);本函數(shù)可檢查目前的 session 之中是否已有指定的變量注冊。參數(shù) name 即為欲檢查的變量名。成功則返回true 值。
b、 給注冊變量歸null
void session_unset(void); 這個(gè)函數(shù)可以把當(dāng)然注冊的所有的session變量置為空。注意它不是unregister,也不同于destroy。 下面這個(gè)例子,對此函數(shù)做了很好的說明。
<?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) 這個(gè)函數(shù)可以定義用戶級(jí)的session的保存函數(shù)(打開、關(guān)閉、寫入等)。比如,我們想把session保存在本地的一個(gè)數(shù)據(jù)庫中時(shí),本函數(shù)就很有用了。缺省情況下,每個(gè)session存貯在系統(tǒng)臨時(shí)目錄的一個(gè)個(gè)獨(dú)立文件中(例如在unix系統(tǒng)中為/tmp)。這適合或不適合,依你的需求而言。例如:如果你的支持php的web服務(wù)器分布在不同的機(jī)器上,你不能很容易地共享它們之間的session(當(dāng)然,你也可以將sessions保存在nfs共享中)。另一個(gè)潛在的問題是你機(jī)器上的數(shù)千或數(shù)百萬個(gè)session文件使你的文件系統(tǒng)變得散亂 。注意:這個(gè)函數(shù)是在4.0b4版本后才出現(xiàn)的。使用本函數(shù)前,先要配置php.ini文件,session.save_hadler=user ,否則,session_set_save_handler()不會(huì)生效。
此外,根據(jù)我的測試,你如果想讓這樣的session跨頁面使用,還要在每一個(gè)用到session的腳本文件中加入你自定的函數(shù)及session_set_save_handler,所以,最好的方法是做成一個(gè)單獨(dú)的文件,在每一個(gè)要用到session的腳本中用include來包含進(jìn)來。
下面這個(gè)例子提供了一個(gè)最基本的session保存法,類似于默認(rèn)的files方法。如果你想用數(shù)據(jù)庫來實(shí)現(xiàn),這也是很容易做到的。
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 // 現(xiàn)在你就可以象往常一樣地使用session了。 ?> 新聞熱點(diǎn)
疑難解答