明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

session全圖文詳細(xì)教程(二)

[摘要]二、php3,4中session的實(shí)現(xiàn) 在php3中是沒(méi)有session這種東東的,但我們又需要,怎么辦呢?別急,有很多人替你做了這些,這其中最有名的要算phplib了。你可以去國(guó)外下載,可以上國(guó)...
二、php3,4中session的實(shí)現(xiàn)

在php3中是沒(méi)有session這種東東的,但我們又需要,怎么辦呢?別急,有很多人替你做了這些,這其中最有名的要算phplib了。你可以去國(guó)外下載,可以上國(guó)內(nèi)大部分php站點(diǎn)下載。我們要做的第一件事是讓phplib和php3結(jié)合在一起使它能工作。為了能實(shí)現(xiàn)這方面的功能,我們需要先安裝phplib。跟著我來(lái)做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通過(guò))phplib最基本的功能包括用戶認(rèn)證,Session管理,權(quán)限及數(shù)據(jù)庫(kù)的抽象化。

怎樣使用phplib來(lái)實(shí)現(xiàn)session功能呢?

一、首先你將phplib解開(kāi),里面有一個(gè)目錄叫"php",將這個(gè)目錄拷貝到apache的安裝目錄下。以筆者的機(jī)器為例:我的apache安裝在d:/apache目錄下,我將上面的"php"目錄拷貝到d:a/pache,并將phplib下的pages 目錄下的文件和目錄一起拷貝到 d:/apache/htdocs下,注意不帶目錄本身。phplib的類庫(kù)需要根據(jù)系統(tǒng)進(jìn)行初始化,你可以修改local.inc文件,其中包含著一些基本參數(shù),你可以根據(jù)自己機(jī)器的實(shí)際情況來(lái)進(jìn)行修改。 將d:/apache/php/prepend.php3文件中的一段程序改為如下樣子:

if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = "d:/apache/php/"; //這兒改為你放phplib下php目錄的路徑
}

然后將d:/apache/php/local.inc文件改如下:

class DB_Example extends DB_Sql {
var $Host = "localhost";//你的mysql數(shù)據(jù)庫(kù)所在主機(jī)名
var $Database = "test";//數(shù)據(jù)庫(kù)名
var $User = "root";//數(shù)據(jù)庫(kù)用戶名
var $Password = "";//數(shù)據(jù)庫(kù)用戶口令
}

最后一步執(zhí)行解開(kāi)的phplib目錄中的stuff目錄下的create_database.mysql文件,生成初始表。我們說(shuō)明一下phplib的工作原理,每一個(gè)使用phplib的頁(yè)面首先必須可以找到運(yùn)行phplib所必須類庫(kù)文件,我們可以在php3.ini中設(shè)置auto_prepend變量來(lái)支持,phplib分發(fā)包中包含一個(gè)prepend.php3文件,將auto_prepend指定"d:/apache/php/prepend.php3"(帶引號(hào))后,各頁(yè)面就會(huì)自動(dòng)包含phplib類庫(kù),我們還可以將phplib類庫(kù)所在目錄加進(jìn)include變量中,以便可以找到這些文件,當(dāng)然,最苯的辦法就是指定phplib的絕對(duì)路徑,這可不是個(gè)好主意,可移植性太差!

第二步,每一個(gè)使用phplib的頁(yè)面中,你必須首先調(diào)用page_open函數(shù)進(jìn)行初始化。這會(huì)告訴phplib,你現(xiàn)在或?qū)?lái)會(huì)用到狀態(tài)保存。一個(gè)典型的
page_open例子如下:

<?php
page_open(array("sess" => "Example_Session"));
?>

數(shù)組變量(sess)用來(lái)初始化一些狀態(tài)保存對(duì)象,注意:必須使用phplib內(nèi)置名(sess),這些內(nèi)置名是你在local.ini中所定義的,page_open函數(shù)必須在頁(yè)面內(nèi)容輸出到瀏覽器之前被調(diào)用。php3腳本最后應(yīng)以page_close()結(jié)束,這將會(huì)將有關(guān)狀態(tài)數(shù)據(jù)寫(xiě)回到數(shù)據(jù)庫(kù)中,如果你忘了的話,結(jié)果你應(yīng)該能想到,哈哈,你的變量全丟了,可不要怪我沒(méi)告訴你...

因?yàn)閜hplib使用了Cookies來(lái)保存狀態(tài)信息,所以page_open()函數(shù)必須在頁(yè)面內(nèi)容輸出到瀏覽器之前被調(diào)用, 這里的頁(yè)面內(nèi)容可以是任何HTML信息或者空行,如果你發(fā)現(xiàn)了錯(cuò)誤"Oops - SetCookie called after header has been sent",這表明在page_open()之前向?yàn)g覽器輸出了些什么,你要特別留意空行,因?yàn)榉浅ky找到,典型的錯(cuò)誤是在<? 和 ? >標(biāo)記之間輸出了空行,你應(yīng)檢查在local.inc和prepend.php3文件中是否包含了空行,這也是一個(gè)非常容易出錯(cuò)的地方。為了減少出錯(cuò)的可能,我們可以這樣書(shū)寫(xiě)初始化程序:
<?
page_open(array("sess" => "Example_Session"));
?>
<html>
.....
</html>

第三步,具體使用。
當(dāng)一個(gè)用戶訪問(wèn)了該網(wǎng)站后,隨即用戶的session就開(kāi)始了,如果用戶的瀏覽器支持cookie的話,將會(huì)建立一個(gè)session的id放入cookie,這個(gè)唯一的ID是由PHP3隨機(jī)生成,然后又用隨機(jī)種子字串進(jìn)行md5加密過(guò)了的,這里的cookie應(yīng)該叫做session cookie,因?yàn)檫@個(gè)cookie是不會(huì)寫(xiě)到用戶硬盤(pán)里去的,當(dāng)一個(gè)session期結(jié)束的時(shí)候,該cookie也被完結(jié)了。如果用戶瀏覽器不支持cookie的話,那么 該session的id將會(huì)放入url鏈中,因?yàn)槭羌用苓^(guò)的,所以竊取了也沒(méi)用。session ID存放著用戶的有關(guān)信息,如用戶已認(rèn)證、認(rèn)證到期時(shí)間、用戶權(quán)限,和其他一些你可能需要的信息,方便我們?nèi)∮。Session其實(shí)就是用戶一次會(huì)話的過(guò)程。Session并不是僅僅用來(lái)跟蹤用戶的注冊(cè),實(shí)際上,它還可以有其它的使用場(chǎng)合,你可以用它來(lái)存儲(chǔ)任何你想要存貯的信息,這些信息可以在用戶隨后訪問(wèn)的頁(yè)面中派上用場(chǎng),當(dāng)然前提是那些頁(yè)面要使用PHPLIB。方法很簡(jiǎn)單,注冊(cè)一個(gè)變量后即可在隨后的頁(yè)面中使用它,直至session結(jié)束。方法:
<?php $sess->register( "variable_name"); ?>

注意,這里的variable_name不是變量值,而是變量名,可以先指定變量名,隨后再賦值。你在某個(gè)頁(yè)面中可以改變變量的值,隨后的頁(yè)面訪問(wèn)該變量會(huì)得到改變后的值。變量的類型是多樣的,可以是一個(gè)字串,一個(gè)數(shù)字,一個(gè)數(shù)組。舉例來(lái)說(shuō)明:

第一頁(yè):
<?php
page_open(array("sess" => "Example_Session"));
$sess->register( "first"); //注意變量名前不需要加$
if (iset($firstname)) {
$first = $firstname;
}
.....
page_close();
?>

第二頁(yè):
<?php
page_open();//開(kāi)始session


echo $first;//看看效果

page_close();//保存狀態(tài)信息
?>

注冊(cè)完一個(gè)變量,當(dāng)頁(yè)面最后調(diào)用page_close()函數(shù)后,各個(gè)session變量會(huì)被寫(xiě)回到數(shù)據(jù)庫(kù)中。如果你忘記調(diào)用page_close()函數(shù)的話,變量就不會(huì)被寫(xiě)回?cái)?shù)據(jù)庫(kù),將出現(xiàn)不可預(yù)知的后果。當(dāng)變量被使用完畢,你不再需要用到時(shí),可以調(diào)用以下函數(shù)將變量刪除:

<?php
page_open(array("sess" => "Example_Session"));
...
$sess->unregister( "variable_name");
...
page_close();
?>

PHPLIB 7.0中,使用了一種存儲(chǔ)結(jié)構(gòu),它允許你存儲(chǔ)session數(shù)據(jù)到數(shù)據(jù)庫(kù)中、共享內(nèi)存中或者LDAP中。PHPLIB使用了數(shù)據(jù)庫(kù)類,這使得你有了更多的選擇,你可以選用oracle8,mysql,postgresql等等數(shù)據(jù)庫(kù)來(lái)保存狀態(tài)信息。

關(guān)于phplib中的其它功能以及有關(guān)session的其它函數(shù)的使用,你可以參看它帶的手冊(cè),或上它的網(wǎng)站看在線文檔。它的老家在http://phplib.netuse.de/index.php3 。php4的session實(shí)現(xiàn)大都從phplib學(xué)來(lái)的,它也靠cookies保存session id,用文件系統(tǒng)保存變量(默認(rèn)情況下)。因此,它的session變量不能保存對(duì)象(事實(shí)上能保存對(duì)象內(nèi)容,但沒(méi)有意義,因?yàn)樗潜4嬖诖疟P(pán)上的,不是活的對(duì)象,充其量也就是對(duì)象尸體。)不過(guò)這點(diǎn)的限制不是太大,我們?cè)诖蟛糠智闆r下都只需要保存變量就行了。當(dāng)然你也可以將session保存在數(shù)據(jù)庫(kù)中,下一小節(jié)中我們會(huì)講到怎樣將session保存在數(shù)據(jù)庫(kù)中。在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置選項(xiàng)。下面我們來(lái)看看各項(xiàng)的作用與意義:

[Session]
session.save_handler = files ; handler used to store/retrieve data(用什么保存session變量,默認(rèn)情況下用文件)
session.save_path = c:/temp ; argument passed to save_handler(保存session變量的目錄,在linux/unix下為/tmp,在win下設(shè)為你的目錄)
; in the case of files, this is the
; path where data files are stored
session.use_cookies = 1 ; whether to use cookies(是否使用cookies,當(dāng)然,在win下別無(wú)選擇)
session.name = PHPSESSID
; name of the session(默認(rèn)session使用的cookies名,建議不要改動(dòng))
; is used as cookie name
session.auto_start = 0 ; initialize session on request startup(是否自動(dòng)啟用session,當(dāng)為1時(shí),在每頁(yè)中就可以不必調(diào)用session_start()函數(shù)了)
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(設(shè)定 cookie 送到瀏覽器后的保存時(shí)間,單位為秒。缺省值為 0,表示直到瀏覽器關(guān)閉。)
; or if 0, until browser is restarted
session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路徑)
session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)
session.serialize_handler = php ; handler used to serialize data(定義序列化數(shù)據(jù)的標(biāo)識(shí),本功能只有 WDDX 模塊或 PHP 內(nèi)部使用。缺省值為 php)
; php is the standard serializer of PHP
session.gc_probability = 1 ; percentual probability that the (設(shè)定每次臨時(shí)文件開(kāi)始處理 (gc, garbage collection) 處理概率。缺省值為 1。 )
; 'garbage collection' process is started
; on every session initialization
session.gc_maxlifetime = 1440 ; after this number of seconds, stored(設(shè)定保存session的臨時(shí)文件被清除前的存活秒數(shù))
; data will be seen as 'garbage' and
; cleaned up by the gc process
session.referer_check = ; check HTTP Referer to invalidate (決定參照到客戶端的Session 代碼是否要?jiǎng)h除。有時(shí)在安全或其它考慮時(shí),會(huì)設(shè)定不刪除。缺省值為 0。)
; externally stored URLs containing ids
session.entropy_length = 0 ; how many bytes to read from the file(設(shè)定 session 從高熵值資源讀取的位數(shù)。缺省值為 0.)
session.entropy_file = ; specified here to create the session id(設(shè)定 session 代碼建立時(shí),使用外部高熵值資源或文件來(lái)建立,例如 UNIX 系統(tǒng)上的 /dev/random 或 /dev/urandom。 )
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; set to { nocache,private,public } to (設(shè)定session緩沖限制)
; determine HTTP caching aspects
session.cache_expire = 180 ; document expires after n minutes(文檔有效期,單位為分鐘)

在windows平臺(tái)下,php4.01pl2以前的版本會(huì)出現(xiàn)設(shè)置session.save_path 后出錯(cuò)的情況,這是php的一個(gè)bug,在php4.01pl2及以后已經(jīng)修正了。如果你用以前的版本,你可以將session.save_path設(shè)為"./",或設(shè)為"/temp",并在你放置php腳本的當(dāng)前盤(pán)根目錄下建一個(gè)名為temp的目錄即可(我的php腳本放在d:apachehtdocs下,則我在d:盤(pán)根目錄下建一名為temp的目錄)。
在php4中有關(guān)session的函數(shù)主要有以下這些:

session_start: 初始化session,需要用session的每一個(gè)頁(yè)面最開(kāi)始處調(diào)用。
session_destroy: 結(jié)束 session,在需要結(jié)束session處調(diào)。
session_name: 存取目前 session 名稱。
session_module_name: 存取目前 session 模塊。
session_save_path: 存取目前 session 路徑。
session_id: 存取目前 session id號(hào)。
session_register: 注冊(cè)新的session變量。
session_unregister: 刪除已注冊(cè)session變量。
session_is_registered: 檢查session變量是否注冊(cè)。
session_decode: Session 數(shù)據(jù)解碼。
session_encode: Session 數(shù)據(jù)加密。

通常情況下我們只需要調(diào)用三個(gè)函數(shù)即可。
即sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一頁(yè)的最開(kāi)始處調(diào)用session_start()函數(shù),
一個(gè)典型的使用session的頁(yè)面如下:
<?session_start()?>
<html>
....
<body>
<?
$var="hello";
session_register("var");//注冊(cè)$var變量,注意沒(méi)有$符號(hào)


if(session_is_registered("var"))//檢查變量是否注冊(cè)
echo "haha,注冊(cè)了!";
else
echo "sorry,還沒(méi)有注冊(cè)!";

?>
</body>
</html>


php4中session處理的定制

我們需要擴(kuò)充6個(gè)函數(shù),當(dāng)然這些函數(shù)不需你去調(diào)用,對(duì)我們來(lái)說(shuō)是透明的。

這幾個(gè)函數(shù)是:
sess_open($sess_path, $session_name);

這個(gè)函數(shù)被session處理程序調(diào)用來(lái)作初始化工作。需要傳給它的兩個(gè)參數(shù)是$sess_path,它對(duì)應(yīng)你的php.ini文件中的session.save_path選項(xiàng);$session_name,它對(duì)應(yīng)php.ini中的session.name 選項(xiàng)。它們具體怎樣工作,請(qǐng)看下面的例子。

sess_close();

這個(gè)函數(shù)在頁(yè)面結(jié)束執(zhí)行并且session處理程序需要關(guān)閉時(shí)被調(diào)用。(注意,不要和sess_destory混淆了,它是用來(lái)結(jié)束session的)

sess_read($key);

這個(gè)函數(shù)在session處理程序讀取指定session鍵值($key)時(shí)。
這個(gè)函數(shù)檢索并返回標(biāo)識(shí)為$key的session數(shù)據(jù).(注意:你不用擔(dān)心怎樣序列化和反序列化數(shù)據(jù),如果你不知道這是什么意思,不要擔(dān)心它)

譯者注:序列化是將變量或?qū)ο笤诔绦蚪Y(jié)束或需要時(shí)保存在文件中,在下次程序運(yùn)行或需要時(shí)再
調(diào)入內(nèi)存的技術(shù),有別于只保存數(shù)據(jù)的方法。

sess_write($key, $val);

這個(gè)函數(shù)據(jù)在session處理程序需要將數(shù)據(jù)保存時(shí)調(diào)用,這種情況經(jīng)常在你的程序結(jié)束時(shí)發(fā)生。它負(fù)責(zé)將數(shù)據(jù)保存在下次能用sess_read($key)函數(shù)檢索的地方。

sess_destroy($key);

這個(gè)函數(shù)在需要消毀session時(shí)。它負(fù)責(zé)刪除session并且清除環(huán)境。


sess_gc($maxlifetime);
這個(gè)函數(shù)負(fù)責(zé)清理碎片。在這種情況下,它負(fù)責(zé)刪除過(guò)時(shí)的session數(shù)據(jù)。session處理程序會(huì)偶爾調(diào)用它們。

現(xiàn)在我們已經(jīng)清楚了我們提供的函數(shù)。

定制程序可以用mysql數(shù)據(jù)庫(kù)或DBM文件保存session數(shù)據(jù)。取決于你的需要。
如果你決定使用mysql作支持,那需要作以下工作:

首先我們?cè)趍ysql中創(chuàng)建一個(gè)sessions數(shù)據(jù)庫(kù),并且創(chuàng)建一個(gè)sessions表。先運(yùn)行你的mysql客戶端并且執(zhí)行下面的命令:
mysql> CREATE DATABASE sessions;

mysql> GRANT select, insert, update, dele ON sessions.* TO phpsession@localhost
-> IDENTIFIED BY 'phpsession';

mysql> CREATE TABLE sessions (
-> sesskey char(32) not null,
-> expiry int(11) unsigned not null,
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );

下一步,修改session_mysql.php文件的$SESS_DB* 變量使其匹配你機(jī)器上的數(shù)據(jù)庫(kù)設(shè)置。

(很抱歉,由于版權(quán)原因,我不能把以下代碼中的英文去掉,只好加些注釋了
==================================================================================
<?
/* ------------------------------------------------------------------------
* session_mysql.php
* ------------------------------------------------------------------------
* PHP4 MySQL Session Handler
* Version 1.00
* by Ying Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000
*
* ------------------------------------------------------------------------
* TERMS OF USAGE:
* ------------------------------------------------------------------------
* You are free to use this library in any way you want, no warranties are
* expressed or implied. This works for me, but I don't guarantee that it
* works for you, USE AT YOUR OWN RISK.
*
* While not required to do so, I would appreciate it if you would retain
* this header information. If you make any modifications or improvements,
* please send them via email to Ying Zhang <ying@zippydesign.com>.
*
* ------------------------------------------------------------------------
* DESCRIPTION:
* ------------------------------------------------------------------------
* This library tells the PHP4 session handler to write to a MySQL database
* instead of creating individual files for each session.
*
* Create a new database in MySQL called "sessions" like so:
*
* CREATE TABLE sessions (
* sesskey char(32) not null,
* expiry int(11) unsigned not null,
* value text not null,
* PRIMARY KEY (sesskey)
* );
*
* ------------------------------------------------------------------------
* INSTALLATION:
* ------------------------------------------------------------------------
* Make sure you have MySQL support compiled into PHP4. Then copy this
* script to a directory that is accessible by the rest of your PHP
* scripts.
* 確信你的php4有mysql支持,然后把這個(gè)腳本拷貝到和你的php腳本有關(guān)的目錄。
* ------------------------------------------------------------------------
* USAGE:(使用方法)
* ------------------------------------------------------------------------
* Include this file in your scripts before you call session_start(), you
* don't have to do anything special after that.
* 包含這個(gè)文件到你要使用session的文件中,必須在調(diào)用session_start()之前,否則,
* 會(huì)很慘的,不要怪我沒(méi)告訴你。 這樣就不需要再做什么工作了,還和你以前用session的方法一樣。
*/

$SESS_DBHOST = "localhost"; /* database server hostname */
$SESS_DBNAME = "sessions"; /* database name */
$SESS_DBUSER = "phpsession"; /* database user */
$SESS_DBPASS = "phpsession"; /* database password */

$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

function sess_open($save_path, $session_name) {
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";
echo "<li>MySQL Error: ", mysql_error();
die;
}

if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
echo "<li>Unable to select database $SESS_DBNAME";
die;
}

return true;
}

function sess_close() {
return true;
}

function sess_read($key) {
global $SESS_DBH, $SESS_LIFE;

$qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time();
$qid = mysql_query($qry, $SESS_DBH);

if (list($value) = mysql_fetch_row($qid)) {
return $value;
}

return false;
}

function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;

$expiry = time() + $SESS_LIFE;
$value = addslashes($val);

$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";
$qid = mysql_query($qry, $SESS_DBH);

if (! $qid) {
$qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey
= '$key' AND expiry > " . time();
$qid = mysql_query($qry, $SESS_DBH);
}

return $qid;
}

function sess_destroy($key) {
global $SESS_DBH;

$qry = "DELETE FROM sessions WHERE sesskey = '$key'";
$qid = mysql_query($qry, $SESS_DBH);

return $qid;
}

function sess_gc($maxlifetime) {
global $SESS_DBH;

$qry = "DELETE FROM sessions WHERE expiry < " . time();
$qid = mysql_query($qry, $SESS_DBH);

return mysql_affected_rows($SESS_DBH);
}

session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy",
"sess_gc");
?>
=================================================================
定制使用dbm文件時(shí)的接口
=================================================================
<?
/* ------------------------------------------------------------------------
* session_dbm.php
* ------------------------------------------------------------------------
* PHP4 DBM Session Handler
* Version 1.00
* by Ying Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000
*
* ------------------------------------------------------------------------
* TERMS OF USAGE:
* ------------------------------------------------------------------------
* You are free to use this library in any way you want, no warranties are
* expressed or implied. This works for me, but I don't guarantee that it
* works for you, USE AT YOUR OWN RISK.
*
* While not required to do so, I would appreciate it if you would retain
* this header information. If you make any modifications or improvements,
* please send them via email to Ying Zhang <ying@zippydesign.com>.
*
* ------------------------------------------------------------------------
* DESCRIPTION:
* ------------------------------------------------------------------------
* This library tells the PHP4 session handler to write to a DBM file
* instead of creating individual files for each session.
*
* ------------------------------------------------------------------------
* INSTALLATION:
* ------------------------------------------------------------------------
* Make sure you have DBM support compiled into PHP4. Then copy this
* script to a directory that is accessible by the rest of your PHP
* scripts.
* 確信你的php4有DBM支持?截愡@個(gè)文件在你的php腳本目錄。
* ------------------------------------------------------------------------
* USAGE:
* ------------------------------------------------------------------------
* Include this file in your scripts before you call session_start(), you
* don't have to do anything special after that.
* 在調(diào)用session_start()之前請(qǐng)包含這個(gè)文件。之后就不需要作什么工作了。
*/

$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

function sess_open($save_path, $session_name) {
global $SESS_DBM;

$SESS_DBM = dbmopen("$save_path/$session_name", "c");
return ($SESS_DBM);
}

function sess_close() {
global $SESS_DBM;

dbmclose($SESS_DBM);
return true;
}

function sess_read($key) {
global $SESS_DBM, $SESS_LIFE;

$var = "";
if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0, strpos($tmp, "│"));

if ($expires_at > time()) {
$var = substr($tmp, strpos($tmp, "│") + 1);
}
}

return $var;
}

function sess_write($key, $val) {
global $SESS_DBM, $SESS_LIFE;

dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . "│" . $val);
return true;
}

function sess_destroy($key) {
global $SESS_DBM;

dbmdele($SESS_DBM, $key);
return true;
}

function sess_gc($maxlifetime) {
global $SESS_DBM;

$now = time();
$key = dbmfirstkey($SESS_DBM);
while ($key) {
if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0, strpos($tmp, "│"));
if ($now > $expires_at) {
sess_destroy($key);
}
}

$key = dbmnextkey($SESS_DBM, $key);
}
}

session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy",
"sess_gc");
?>

=================================================================
具體怎么用就不用多說(shuō)了,因?yàn)檫@些函數(shù)都是php引擎調(diào)用的,與我們無(wú)關(guān)的。我們只需照上述配
置后就行了,你用的還是以前的session函數(shù)。
看看下面的代碼就知道了:)


session定制的測(cè)試代碼
==================================================================
<?
/* ------------------------------------------------------------------------
* test.php
* ------------------------------------------------------------------------
* PHP4 Customer Session Handler Test Script
* Version 1.00
* by Ying Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000
*/

/* default to DBM handler */
if (! isset($handler)) {
$handler = "dbm";
}

/* default action is increment */
if (! isset($action)) {
$action = "increment";
}

/* load up the appropriate session handling script, depending on the handler */
if ($handler == "dbm") {
include("session_dbm.php");

} elseif ($handler == "mysql") {
include("session_mysql.php");

} else {
echo "<li>Unrecognized handler ($handler)";
die;
}

/* start the session and register a simple counter */
session_start();
session_register("count");

/* figure out what we should do, depending on the action */
switch ($action) {
case "increment" :
$count = isset($count) ? $count + 1 : 0;
break;

case "destroy" :
session_destroy();
break;

case "gc" :
$maxlife = get_cfg_var("session.gc_maxlifetime");
sess_gc($maxlife);
break;

default:
echo "<li>Unknown action ($action)";
break;
}
?>

<h1>Session Test Script</h1>
<ul>
<li>Handler: <b><?=$handler?></b>
<li>Action: <b><?=$action?></b>
<li>Count: <b><?=$count?></b>
</ul>

<hr size=1>
<form>
<table>
<tr>
<td>Handler:</td>
<td>
<select name="handler">
<option value="dbm">DBM</option>
<option value="mysql">MySQL</option>
</select>
</td>
</tr>
<tr>
<td>Action:</td>
<td>
<select name="action">
<option value="increment">Increment</option>
<option value="destroy">Session Destroy</option>
<option value="gc">Force Garbage Collection</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><br><input type="submit"></td>
</tr>

</form>
=======================================================================