«
session全教程(二)

时间:2008-5-31    作者:Deri    分类: 分享


   <p>  二、php3,4中session的实现 </p><p>  在php3中是没有session这种东东的,但我们又需要,怎么办呢?别急,有很多人替你做了这些,这其中最有名的要算phplib了。你可以去国外下载,可以上国内大部分php站点下载。我们要做的第一件事是让phplib和php3结合在一起使它能工作。为了能实现这方面的功能,我们需要先安装phplib。跟着我来做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通过)phplib最基本的功能包括用户认证,Session管理,权限及数据库的抽象化。</p><p>  怎样使用phplib来实现session功能呢?</p><p>  一、首先你将phplib解开,里面有一个目录叫"php",将这个目录拷贝到apache的安装目录下。以笔者的机器为例:我的apache安装在d:/apache目录下,我将上面的"php"目录拷贝到d:a/pache,并将phplib下的pages 目录下的文件和目录一起拷贝到 d:/apache/htdocs下,注意不带目录本身。phplib的类库需要根据系统进行初始化,你可以修改local.inc文件,其中包含着一些基本参数,你可以根据自己机器的实际情况来进行修改。 将d:/apache/php/prepend.php3文件中的一段程序改为如下样子: </p><p>  <code>if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {&#160;<br />&#160;$_PHPLIB["libdir"] = "d:/apache/php/"; //这儿改为你放phplib下php目录的路径&#160;<br />} <br />然后将d:/apache/php/local.inc文件改如下: <br />class DB_Example extends DB_Sql {&#160;<br />&#160;var $Host = "localhost";//你的mysql数据库所在主机名&#160;<br />&#160;var $Database = "test";//数据库名&#160;<br />&#160;var $User = "root";//数据库用户名&#160;<br />&#160;var $Password = "";//数据库用户口令&#160;<br />}</code></p>
<p> </p>

   <p>  最后一步执行解开的phplib目录中的stuff目录下的create_database.mysql文件,生成初始表。我们说明一下phplib的工作原理,每一个使用phplib的页面首先必须可以找到运行phplib所必须类库文件,我们可以在php3.ini中设置auto_prepend变量来支持,phplib分发包中包含一个prepend.php3文件,将auto_prepend指定"d:/apache/php/prepend.php3"(带引号)后,各页面就会自动包含phplib类库,我们还可以将phplib类库所在目录加进include变量中,以便可以找到这些文件,当然,最苯的办法就是指定phplib的绝对路径,这可不是个好主意,可移植性太差!</p><p>  第二步,每一个使用phplib的页面中,你必须首先调用page_open函数进行初始化。这会告诉phplib,你现在或将来会用到状态保存。一个典型的&#160;</p><p>  page_open例子如下:</p><p>  <code><?php&#160;<br />page_open(array("sess" => "Example_Session"));&#160;<br />?></code></p><p>  数组变量(sess)用来初始化一些状态保存对象,注意:必须使用phplib内置名(sess),这些内置名是你在local.ini中所定义的,page_open函数必须在页面内容输出到浏览器之前被调用。php3脚本最后应以page_close()结束,这将会将有关状态数据写回到数据库中,如果你忘了的话,结果你应该能想到,哈哈,你的变量全丢了,可不要怪我没告诉你... </p><p>  因为phplib使用了Cookies来保存状态信息,所以page_open()函数必须在页面内容输出到浏览器之前被调用, 这里的页面内容可以是任何HTML信息或者空行,如果你发现了错误"Oops - SetCookie called after header has been sent",这表明在page_open()之前向浏览器输出了些什么,你要特别留意空行,因为非常难找到,典型的错误是在<? 和 ? >标记之间输出了空行,你应检查在local.inc和prepend.php3文件中是否包含了空行,这也是一个非常容易出错的地方。为了减少出错的可能,我们可以这样书写初始化程序:&#160;</p>
 <p> </p>

   <p>  <code><?&#160;<br />page_open(array("sess" => "Example_Session"));&#160;<br />?>&#160;<br /><html>&#160;<br />.....&#160;<br /></html></code></p><p>  第三步,具体使用。&#160;</p><p>  当一个用户访问了该网站后,随即用户的session就开始了,如果用户的浏览器支持cookie的话,将会建立一个session的id放入cookie,这个唯一的ID是由PHP3随机生成,然后又用随机种子字串进行md5加密过了的,这里的cookie应该叫做session cookie,因为这个cookie是不会写到用户硬盘里去的,当一个session期结束的时候,该cookie也被完结了。如果用户浏览器不支持cookie的话,那么 该session的id将会放入url链中,因为是加密过的,所以窃取了也没用。session ID存放着用户的有关信息,如用户已认证、认证到期时间、用户权限,和其他一些你可能需要的信息,方便我们取用。Session其实就是用户一次会话的过程。Session并不是仅仅用来跟踪用户的注册,实际上,它还可以有其它的使用场合,你可以用它来存储任何你想要存贮的信息,这些信息可以在用户随后访问的页面中派上用场,当然前提是那些页面要使用PHPLIB。方法很简单,注册一个变量后即可在随后的页面中使用它,直至session结束。方法:&#160;</p><p>  <?php $sess->register( "variable_name"); ?> </p><p>  注意,这里的variable_name不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改变变量的值,随后的页面访问该变量会得到改变后的值。变量的类型是多样的,可以是一个字串,一个数字,一个数组。举例来说明:</p><p>  第一页:&#160;</p><p>  <code><?php&#160;<br />page_open(array("sess" => "Example_Session"));&#160;<br />$sess->register( "first"); //注意变量名前不需要加$&#160;<br />if (iset($firstname)) {&#160;<br />$first = $firstname;&#160;<br />}&#160;<br />.....&#160;<br />page_close();&#160;<br />?></code></p>
 <p> </p>

   <p>  第二页:&#160;</p><p>  <code><?php&#160;<br />page_open();//开始session <br />echo $first;//看看效果 <br />page_close();//保存状态信息&#160;<br />?></code></p><p>  注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果你忘记调用page_close()函数的话,变量就不会被写回数据库,将出现不可预知的后果。当变量被使用完毕,你不再需要用到时,可以调用以下函数将变量删除:</p><p>  <code><?php&#160;<br />page_open(array("sess" => "Example_Session"));&#160;<br />...&#160;<br />$sess->unregister( "variable_name");&#160;<br />...&#160;<br />page_close();&#160;<br />?></code></p><p>  PHPLIB 7.0中,使用了一种存储结构,它允许你存储session数据到数据库中、共享内存中或者LDAP中。PHPLIB使用了数据库类,这使得你有了更多的选择,你可以选用oracle8,mysql,postgresql等等数据库来保存状态信息。 </p><p>  关于phplib中的其它功能以及有关session的其它函数的使用,你可以参看它带的手册,或上它的网站看在线文档。它的老家在<a href="http://phplib.netuse.de/index.php3">http://phplib.netuse.de/index.php3</a> 。php4的session实现大都从phplib学来的,它也靠cookies保存session id,用文件系统保存变量(默认情况下)。因此,它的session变量不能保存对象(事实上能保存对象内容,但没有意义,因为它是保存在磁盘上的,不是活的对象,充其量也就是对象尸体。)不过这点的限制不是太大,我们在大部分情况下都只需要保存变量就行了。当然你也可以将session保存在数据库中,下一小节中我们会讲到怎样将session保存在数据库中。在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置选项。下面我们来看看各项的作用与意义: </p>
 <p> </p>

   <p>  [Session]&#160;</p><p>  session.save_handler = files ; handler used to store/retrieve data(用什么保存session变量,默认情况下用文件)&#160;</p><p>  session.save_path = c:/temp ; argument passed to save_handler(保存session变量的目录,在linux/unix下为/tmp,在win下设为你的目录)&#160;</p><p>  ; in the case of files, this is the&#160;</p><p>  ; path where data files are stored&#160;</p><p>  session.use_cookies = 1 ; whether to use cookies(是否使用cookies,当然,在win下别无选择)&#160;</p><p>  session.name = PHPSESSID&#160;</p><p>  ; name of the session(默认session使用的cookies名,建议不要改动)&#160;</p><p>  ; is used as cookie name&#160;</p><p>  session.auto_start = 0 ; initialize session on request startup(是否自动启用session,当为1时,在每页中就可以不必调用session_start()函数了)&#160;</p><p>  session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设定 cookie 送到浏览器后的保存时间,单位为秒。缺省值为 0,表示直到浏览器关闭。)&#160;</p><p>  ; or if 0, until browser is restarted&#160;</p><p>  session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路径)&#160;</p><p>  session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)&#160;</p><p>  session.serialize_handler = php ; handler used to serialize data(定义序列化数据的标识,本功能只有 WDDX 模块或 PHP 内部使用。缺省值为 php)&#160;</p><p>  ; php is the standard serializer of PHP&#160;</p><p>  session.gc_probability = 1 ; percentual probability that the (设定每次临时文件开始处理 (gc, garbage collection) 处理概率。缺省值为 1。 )&#160;</p>
 <p> </p>

   <p>  ; 'garbage collection' process is started&#160;</p><p>  ; on every session initialization&#160;</p><p>  session.gc_maxlifetime = 1440 ; after this number of seconds, stored(设定保存session的临时文件被清除前的存活秒数)&#160;</p><p>  ; data will be seen as 'garbage' and&#160;</p><p>  ; cleaned up by the gc process&#160;</p><p>  session.referer_check = ; check HTTP Referer to invalidate (决定参照到客户端的Session 代码是否要删除。有时在安全或其它考虑时,会设定不删除。缺省值为 0。)&#160;</p><p>  ; externally stored URLs containing ids&#160;</p><p>  session.entropy_length = 0 ; how many bytes to read from the file(设定 session 从高熵值资源读取的位数。缺省值为 0.)&#160;</p><p>  session.entropy_file = ; specified here to create the session id(设定 session 代码建立时,使用外部高熵值资源或文件来建立,例如 UNIX 系统上的 /dev/random 或 /dev/urandom。 )&#160;</p><p>  ; session.entropy_length = 16&#160;</p><p>  ; session.entropy_file = /dev/urandom&#160;</p><p>  session.cache_limiter = nocache ; set to { nocache,private,public } to (设定session缓冲限制)&#160;</p><p>  ; determine HTTP caching aspects&#160;</p><p>  session.cache_expire = 180 ; document expires after n minutes(文档有效期,单位为分钟)</p><p>  在windows平台下,php4.01pl2以前的版本会出现设置session.save_path 后出错的情况,这是php的一个bug,在php4.01pl2及以后已经修正了。如果你用以前的版本,你可以将session.save_path设为"./",或设为"/temp",并在你放置php脚本的当前盘根目录下建一个名为temp的目录即可(我的php脚本放在d:apachehtdocs下,则我在d:盘根目录下建一名为temp的目录)。&#160;</p>
 <p> </p>

   <p>  在php4中有关session的函数主要有以下这些: </p><p>  session_start: 初始化session,需要用session的每一个页面最开始处调用。&#160;</p><p>  session_destroy: 结束 session,在需要结束session处调。&#160;</p><p>  session_name: 存取目前 session 名称。&#160;</p><p>  session_module_name: 存取目前 session 模块。&#160;</p><p>  session_save_path: 存取目前 session 路径。&#160;</p><p>  session_id: 存取目前 session id号。&#160;</p><p>  session_register: 注册新的session变量。&#160;</p><p>  session_unregister: 删除已注册session变量。&#160;</p><p>  session_is_registered: 检查session变量是否注册。&#160;</p><p>  session_decode: Session 数据解码。&#160;</p><p>  session_encode: Session 数据加密。 </p><p>  通常情况下我们只需要调用三个函数即可。&#160;</p><p>  即sesssion_start()、session_register()、session_is_registered()。&#160;</p><p>  在需要用到session的每一页的最开始处调用session_start()函数,&#160;</p><p>  一个典型的使用session的页面如下:&#160;</p><p>  <code><?session_start()?>&#160;<br /><html>&#160;<br />....&#160;<br /><body>&#160;<br /><?&#160;<br />$var="hello";&#160;<br />session_register("var");//注册$var变量,注意没有$符号 <br />if(session_is_registered("var"))//检查变量是否注册&#160;<br />echo "haha,注册了!";&#160;<br />else&#160;<br />echo "sorry,还没有注册!"; <br />?>&#160;<br /></body>&#160;<br /></html></code></p><p>  php4中session处理的定制 </p>
 <p> </p>

   <p>  我们需要扩充6个函数,当然这些函数不需你去调用,对我们来说是透明的。 </p><p>  这几个函数是:&#160;</p><p>  sess_open($sess_path, $session_name); </p><p>  这个函数被session处理程序调用来作初始化工作。需要传给它的两个参数是$sess_path,它对应你的php.ini文件中的session.save_path选项;$session_name,它对应php.ini中的session.name 选项。它们具体怎样工作,请看下面的例子。 </p><p>  sess_close(); </p><p>  这个函数在页面结束执行并且session处理程序需要关闭时被调用。(注意,不要和sess_destory混淆了,它是用来结束session的) </p><p>  sess_read($key); </p><p>  这个函数在session处理程序读取指定session键值($key)时。&#160;</p><p>  这个函数检索并返回标识为$key的session数据.(注意:你不用担心怎样序列化和反序列化数据,如果你不知道这是什么意思,不要担心它) </p><p>  译者注:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再</p><p>  调入内存的技术,有别于只保存数据的方法。 </p><p>  sess_write($key, $val); </p><p>  这个函数据在session处理程序需要将数据保存时调用,这种情况经常在你的程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。 </p><p>  sess_destroy($key); </p><p>  这个函数在需要消毁session时。它负责删除session并且清除环境。 </p><p>  sess_gc($maxlifetime);&#160;</p><p>  这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。 </p><p>  现在我们已经清楚了我们提供的函数。 </p><p>  定制程序可以用mysql数据库或DBM文件保存session数据。取决于你的需要。&#160;</p>
 <p> </p>

   <p>  如果你决定使用mysql作支持,那需要作以下工作: </p><p>  首先我们在mysql中创建一个sessions数据库,并且创建一个sessions表。先运行你的mysql客户端并且执行下面的命令:&#160;</p><p>  <code>mysql> CREATE DATABASE sessions; <br />mysql> GRANT select, insert, update, dele ON sessions.* TO <a href="mailto:phpsession@localhost">phpsession@localhost</a>&#160;<br />-> IDENTIFIED BY 'phpsession'; <br />mysql> CREATE TABLE sessions (&#160;<br />-> sesskey char(32) not null,&#160;<br />-> expiry int(11) unsigned not null,&#160;<br />-> value text not null,&#160;<br />-> PRIMARY KEY (sesskey)&#160;<br />-> );</code></p><p>  下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置。 </p><p>  (很抱歉,由于版权原因,我不能把以下代码中的英文去掉,只好加些注释了&#160;</p><p>  ==================================================================================&#160;</p><p>  <code><?&#160;<br />/* ------------------------------------------------------------------------&#160;<br />* session_mysql.php&#160;<br />* ------------------------------------------------------------------------&#160;<br />* PHP4 MySQL Session Handler&#160;<br />* Version 1.00&#160;<br />* by Ying Zhang (<a href="mailto:ying@zippydesign.com">ying@zippydesign.com</a>)&#160;<br />* Last Modified: May 21 2000&#160;<br />*&#160;<br />* ------------------------------------------------------------------------&#160;<br />* TERMS OF USAGE:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* You are free to use this library in any way you want, no warranties are&#160;<br />* expressed or implied. This works for me, but I don't guarantee that it&#160;<br />* works for you, USE AT YOUR OWN RISK.&#160;<br />*&#160;<br />* While not required to do so, I would appreciate it if you would retain&#160;<br />* this header information. If you make any modifications or improvements,&#160;<br />* please send them via email to Ying Zhang <<a href="mailto:ying@zippydesign.com">ying@zippydesign.com</a>>.&#160;<br />*&#160;<br />* ------------------------------------------------------------------------&#160;<br />* DESCRIPTION:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* This library tells the PHP4 session handler to write to a MySQL database&#160;<br />* instead of creating individual files for each session.&#160;<br />*&#160;<br />* Create a new database in MySQL called "sessions" like so:&#160;<br />*&#160;<br />* CREATE TABLE sessions (&#160;<br />* sesskey char(32) not null,&#160;<br />* expiry int(11) unsigned not null,&#160;<br />* value text not null,&#160;<br />* PRIMARY KEY (sesskey)&#160;<br />* );&#160;<br />*&#160;<br />* ------------------------------------------------------------------------&#160;<br />* INSTALLATION:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* Make sure you have MySQL support compiled into PHP4. Then copy this&#160;<br />* script to a directory that is accessible by the rest of your PHP&#160;<br />* scripts.&#160;<br />* 确信你的php4有mysql支持,然后把这个脚本拷贝到和你的php脚本有关的目录。&#160;<br />* ------------------------------------------------------------------------&#160;<br />* USAGE:(使用方法)&#160;<br />* ------------------------------------------------------------------------&#160;<br />* Include this file in your scripts before you call session_start(), you&#160;<br />* don't have to do anything special after that.&#160;<br />* 包含这个文件到你要使用session的文件中,必须在调用session_start()之前,否则,&#160;<br />* 会很惨的,不要怪我没告诉你。 这样就不需要再做什么工作了,还和你以前用session的方法一样。&#160;<br />*/ <br />$SESS_DBHOST = "localhost"; /* database server hostname */&#160;<br />$SESS_DBNAME = "sessions"; /* database name */&#160;<br />$SESS_DBUSER = "phpsession"; /* database user */&#160;<br />$SESS_DBPASS = "phpsession"; /* database password */ <br />$SESS_DBH = "";&#160;<br />$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); <br />function sess_open($save_path, $session_name) {&#160;<br />global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH; <br />if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {&#160;<br />echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";&#160;<br />echo "<li>MySQL Error: ", mysql_error();&#160;<br />die;&#160;<br />} <br />if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {&#160;<br />echo "<li>Unable to select database $SESS_DBNAME";&#160;<br />die;&#160;<br />} <br />return true;&#160;<br />} <br />function sess_close() {&#160;<br />return true;&#160;<br />} <br />function sess_read($key) {&#160;<br />global $SESS_DBH, $SESS_LIFE; <br />$qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " . time();&#160;<br />$qid = mysql_query($qry, $SESS_DBH); <br />if (list($value) = mysql_fetch_row($qid)) {&#160;<br />return $value;&#160;<br />} <br />return false;&#160;<br />} <br />function sess_write($key, $val) {&#160;<br />global $SESS_DBH, $SESS_LIFE; <br />$expiry = time() + $SESS_LIFE;&#160;<br />$value = addslashes($val); <br />$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";&#160;<br />$qid = mysql_query($qry, $SESS_DBH); <br />if (! $qid) {&#160;<br />$qry = "UPDATE sessions SET expiry = $expiry, value = '$value' WHERE sesskey&#160;<br />= '$key' AND expiry > " . time();&#160;<br />$qid = mysql_query($qry, $SESS_DBH);&#160;<br />} <br />return $qid;&#160;<br />} <br />function sess_destroy($key) {&#160;<br />global $SESS_DBH; <br />$qry = "DELETE FROM sessions WHERE sesskey = '$key'";&#160;<br />$qid = mysql_query($qry, $SESS_DBH); <br />return $qid;&#160;<br />} <br />function sess_gc($maxlifetime) {&#160;<br />global $SESS_DBH; <br />$qry = "DELETE FROM sessions WHERE expiry < " . time();&#160;<br />$qid = mysql_query($qry, $SESS_DBH); <br />return mysql_affected_rows($SESS_DBH);&#160;<br />} <br />session_set_save_handler(&#160;<br />"sess_open",&#160;<br />"sess_close",&#160;<br />"sess_read",&#160;<br />"sess_write",&#160;<br />"sess_destroy",&#160;<br />"sess_gc");&#160;<br />?>&#160;</code></p>
 <p> </p>

   <p>  =================================================================&#160;</p><p>  定制使用dbm文件时的接口&#160;</p><p>  =================================================================&#160;</p><p>  <code><?&#160;<br />/* ------------------------------------------------------------------------&#160;<br />* session_dbm.php&#160;<br />* ------------------------------------------------------------------------&#160;<br />* PHP4 DBM Session Handler&#160;<br />* Version 1.00&#160;<br />* by Ying Zhang (<a href="mailto:ying@zippydesign.com">ying@zippydesign.com</a>)&#160;<br />* Last Modified: May 21 2000&#160;<br />*&#160;<br />* ------------------------------------------------------------------------&#160;<br />* TERMS OF USAGE:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* You are free to use this library in any way you want, no warranties are&#160;<br />* expressed or implied. This works for me, but I don't guarantee that it&#160;<br />* works for you, USE AT YOUR OWN RISK.&#160;<br />*&#160;<br />* While not required to do so, I would appreciate it if you would retain&#160;<br />* this header information. If you make any modifications or improvements,&#160;<br />* please send them via email to Ying Zhang <<a href="mailto:ying@zippydesign.com">ying@zippydesign.com</a>>.&#160;<br />*&#160;<br />* ------------------------------------------------------------------------&#160;<br />* DESCRIPTION:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* This library tells the PHP4 session handler to write to a DBM file&#160;<br />* instead of creating individual files for each session.&#160;<br />*&#160;<br />* ------------------------------------------------------------------------&#160;<br />* INSTALLATION:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* Make sure you have DBM support compiled into PHP4. Then copy this&#160;<br />* script to a directory that is accessible by the rest of your PHP&#160;<br />* scripts.&#160;<br />* 确信你的php4有DBM支持。拷贝这个文件在你的php脚本目录。&#160;<br />* ------------------------------------------------------------------------&#160;<br />* USAGE:&#160;<br />* ------------------------------------------------------------------------&#160;<br />* Include this file in your scripts before you call session_start(), you&#160;<br />* don't have to do anything special after that.&#160;<br />* 在调用session_start()之前请包含这个文件。之后就不需要作什么工作了。&#160;<br />*/ <br />$SESS_DBM = "";&#160;<br />$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); <br />function sess_open($save_path, $session_name) {&#160;<br />global $SESS_DBM; <br />$SESS_DBM = dbmopen("$save_path/$session_name", "c");&#160;<br />return ($SESS_DBM);&#160;<br />} <br />function sess_close() {&#160;<br />global $SESS_DBM; <br />dbmclose($SESS_DBM);&#160;<br />return true;&#160;<br />} <br />function sess_read($key) {&#160;<br />global $SESS_DBM, $SESS_LIFE; <br />$var = "";&#160;<br />if ($tmp = dbmfetch($SESS_DBM, $key)) {&#160;<br />$expires_at = substr($tmp, 0, strpos($tmp, "│")); <br />if ($expires_at > time()) {&#160;<br />$var = substr($tmp, strpos($tmp, "│") + 1);&#160;<br />}&#160;<br />} <br />return $var;&#160;<br />} <br />function sess_write($key, $val) {&#160;<br />global $SESS_DBM, $SESS_LIFE; <br />dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . "│" . $val);&#160;<br />return true;&#160;<br />} <br />function sess_destroy($key) {&#160;<br />global $SESS_DBM; <br />dbmdele($SESS_DBM, $key);&#160;<br />return true;&#160;<br />} <br />function sess_gc($maxlifetime) {&#160;<br />global $SESS_DBM; <br />$now = time();&#160;<br />$key = dbmfirstkey($SESS_DBM);&#160;<br />while ($key) {&#160;<br />if ($tmp = dbmfetch($SESS_DBM, $key)) {&#160;<br />$expires_at = substr($tmp, 0, strpos($tmp, "│"));&#160;<br />if ($now > $expires_at) {&#160;<br />sess_destroy($key);&#160;<br />}&#160;<br />} <br />$key = dbmnextkey($SESS_DBM, $key);&#160;<br />}&#160;<br />} <br />session_set_save_handler(&#160;<br />"sess_open",&#160;<br />"sess_close",&#160;<br />"sess_read",&#160;<br />"sess_write",&#160;<br />"sess_destroy",&#160;<br />"sess_gc");&#160;<br />?></code></p>
 <p> </p>

   <p>  =================================================================&#160;</p><p>  具体怎么用就不用多说了,因为这些函数都是php引擎调用的,与我们无关的。我们只需照上述配</p><p>  置后就行了,你用的还是以前的session函数。&#160;</p><p>  看看下面的代码就知道了:) </p><p>  session定制的测试代码&#160;</p><p>  ==================================================================&#160;</p><p>  <code><?&#160;<br />/* ------------------------------------------------------------------------&#160;<br />* test.php&#160;<br />* ------------------------------------------------------------------------&#160;<br />* PHP4 Customer Session Handler Test Script&#160;<br />* Version 1.00&#160;<br />* by Ying Zhang (<a href="mailto:ying@zippydesign.com">ying@zippydesign.com</a>)&#160;<br />* Last Modified: May 21 2000&#160;<br />*/ <br />/* default to DBM handler */&#160;<br />if (! isset($handler)) {&#160;<br />$handler = "dbm";&#160;<br />} <br />/* default action is increment */&#160;<br />if (! isset($action)) {&#160;<br />$action = "increment";&#160;<br />} <br />/* load up the appropriate session handling script, depending on the handler */&#160;<br />if ($handler == "dbm") {&#160;<br />include("session_dbm.php"); <br />} elseif ($handler == "mysql") {&#160;<br />include("session_mysql.php"); <br />} else {&#160;<br />echo "<li>Unrecognized handler ($handler)";&#160;<br />die;&#160;<br />} <br />/* start the session and register a simple counter */&#160;<br />session_start();&#160;<br />session_register("count"); <br />/* figure out what we should do, depending on the action */&#160;<br />switch ($action) {&#160;<br />case "increment" :&#160;<br />$count = isset($count) ? $count + 1 : 0;&#160;<br />break; <br />case "destroy" :&#160;<br />session_destroy();&#160;<br />break; <br />case "gc" :&#160;<br />$maxlife = get_cfg_var("session.gc_maxlifetime");&#160;<br />sess_gc($maxlife);&#160;<br />break; <br />default:&#160;<br />echo "<li>Unknown action ($action)";&#160;<br />break;&#160;<br />}&#160;<br />?> <br /><h1>Session Test Script</h1>&#160;<br /><ul>&#160;<br /><li>Handler: <b><?=$handler?></b>&#160;<br /><li>Action: <b><?=$action?></b>&#160;<br /><li>Count: <b><?=$count?></b>&#160;<br /></ul> <br /><hr size=1>&#160;<br /><form>&#160;<br /><table>&#160;<br /><tr>&#160;<br /><td>Handler:</td>&#160;<br /><td>&#160;<br /><select name="handler">&#160;<br /><option value="dbm">DBM</option>&#160;<br /><option value="mysql">MySQL</option>&#160;<br /></select>&#160;<br /></td>&#160;<br /></tr>&#160;<br /><tr>&#160;<br /><td>Action:</td>&#160;<br /><td>&#160;<br /><select name="action">&#160;<br /><option value="increment">Increment</option>&#160;<br /><option value="destroy">Session Destroy</option>&#160;<br /><option value="gc">Force Garbage Collection</option>&#160;<br /></select>&#160;<br /></td>&#160;<br /></tr>&#160;<br /><tr>&#160;<br /><td></td>&#160;<br /><td><br><input type="submit"></td>&#160;<br /></tr>&#160;<br /></table>&#160;<br /></form>&#160;</code></p>