動態網頁常用技術:用PHP追隨變數(cookie和session)

日期:2007-07-02  作者:喜騰小二  來源:PHPChina


在很多時候,我們需要跟蹤浏覽者在整個網站的活動,對他們身份進行自動或半自動的識別(也就是平時常說的網站登陸之類的功能),這時候,我們常采用一組變數來“追隨”訪客。實現變數“追隨”有很多種方法,比較用得多的是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。
下麵這個例子,對此函式做了很好的幫助。


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
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了。
?>

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计