PHP中session全面教程
时间:2007-02-17 来源:PHP爱好者
来源:znsoft
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
PHP中session全面教程
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
作者:znsoft
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
一、session概述
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session是什么,刚开始我也不明白,非专业词典翻译为会议,会议期。直到接触asp后才知道session是干什么的,有什么用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
作个不太恰当的比喻吧(虽然不恰当,但意义却是一样的),session就好象你和你女友(或妻子)之间的感情似的,session是你和
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
网站之间的感情。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session在WEB技术中占有非常重要的份量。由于网页是一种无状态的连接程序,因此你无法得知用户的浏览状态。因此我们必须
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
通过session记录用户的有关信息,以供用户再次以此身份对web服务器提供要求时作确认,例如,我们在某些网站中常常要求用户登录,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
但我们怎么知道用户已经登录了呢,如果没有session的话,登录信息是无法保留的,那岂不要让用户在每一页网页中都要提供
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
用户名和密码。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
当然,session不光用于用户身份认证功能,还可能用于其它方面,以后我们会提到的。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session用中文来解释就是会话期。一个会话期开始于用户输入一个站点的网址时,结束于他离开这个站点时。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session最早出现在动态脚本语言Active Server Pages中,它的功能之强大,是一句话无法说清楚的。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
当php还在3.0版本时,session是它永远的痛。虽然php具有执行速度快,使用灵活,功能强大等优点,但因为session的问题,使
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
很多站点的开发放弃了php,至少我的老板是这样认为的。当时有很多php免费函数库提供在php3上实现session的方案,但都让人感觉不正宗。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
就好象你花好几千大洋买的手机却配置一个很粗糙的草作的袋子一样,虽然功能是一样的,但总让人觉得别扭。php4的出现让php在session问题上
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
有了翻身的机会。虽然它的session实现还不是很理想(主要是效率问题),但毕竟是它自己实现的,而且可以实际使用了。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
那我们用session干什么呢,你说了半天,我用不上的话,你岂不有卖纸张之嫌。OK,我们来看看session有什么用:作过网站的人都有
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这样的体会,在一页页面中的变量(在本章都指服务器端变量,下同)是不能在下一页中用的,虽然有一些办法可以实现,比如用form,urlstring等等
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
但有些对于用户来说是不方便的,即使让form自动提交,但其中的延时在现今的网络状况下足以让人窒息,而这两种方法都明显加大程序员的负担。如果你
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
正在开发一个大型项目,那这些额外的负担是不能忽略的。而有了session就好办了,session中注册的变量可以作为全局变量使用。什么,全局变量?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
好极了。这样一来,你知道有什么用了吧:最主要的用于用户身份认证,程序状态记录,页面之间参数传递。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
说了它这么半天的好处,你已经动心了吧,先别高兴,它还有缺点呢:它是用文件保存的变量(当然效率不高了,虽然可以用别的方式,但
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
很麻烦的),不能保存对象。与之相对的是,asp中的session可以保存对象变量,用内存变量来保存session变量。但为什么我们还选用php呢,呵呵,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
为什么,你能从本书的开始看到这章,想必你也应该明白了吧,你还不明白,Faint,你再从头看起吧,我保证你成为PHP专家^_^。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session是怎样实现的呢?呵呵,你一定以为很高深吧,我来告诉你它的秘密。如果说只保存变量的话,很多读者都明白,这是很简单的,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
但前面我们说过,http协议是一种无状态的连接,你怎么知道那个变量是谁的,这个变量又是谁的呢?在session实现中用cookie实现的。cookie
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
存在于客户端,也就是用户的机器中,里面保存着用户的session ID,也就是session号码,当用户的浏览器请求服务器时把session ID也一起送到
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
服务器,这样服务器就可以识别你是谁,也就可以把变量识别开了。这样我们就不难理解了,为什么有时session会失效了。不信的话,你可以试试:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在IE的"工具"菜单上有"Internet选项"菜单,打开后再选"安全"->"自定义级别",将安全设置中的"允许使用每个对话cookies"设为禁用,再看看
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session能不能用。这下明白了吧!不过php4在linux/unix平台上可以自动检查cookies状态,当cookies 不可用时,自动会把session ID
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
附带在url上进行传递。这是它在session方面比asp多的唯一的优点了。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
二、php3,4中session的实现
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在php3中是没有session这种东东的,但我们又需要,怎么办呢?别急,有很多人替你做了这些,这其中最有名的要算phplib了。你可以去国外下
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
载,也可以上国内大部分php站点下载。我们要做的第一件事是让phplib和php3结合在一起使它能工作。为了能实现这方面的功能,我们需要先安装phplib。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
跟着我来做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通过)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
phplib最基本的功能包括用户认证,Session管理,权限及数据库的抽象化。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
怎样使用phplib来实现session功能呢?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
一、首先你将phplib解开,里面有一个目录叫"php",将这个目录拷贝到apache的安装目录下。以下以笔者的机器为例:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
我的apache安装在d:apache 目录下,我将上面的"php"目录拷贝到d:apache,并将phplib下的pages目录下的文件和目录一起拷贝到
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
d:apachehtdocs下,注意不带目录本身。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
phplib的类库需要根据系统进行初始化,你可以修改local.inc文件,其中包含着一些基本参数,你可以根据自己机器的实际情况来进行修改。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
将d:apachephpprepend.php3文件中的一段程序改为如下样子:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$_PHPLIB["libdir"] = "d:/apache/php/"; //这儿改为你放phplib下php目录的路径
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
然后将d:apachephplocal.inc文件改如下:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
class DB_Example extends DB_Sql {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $Host = "localhost";//你的mysql数据库所在主机名
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $Database = "test";//数据库名
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $User = "root";//数据库用户名
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $Password = "";//数据库用户口令
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
最后一步执行解开的phplib目录中的stuff目录下的create_database.mysql文件,生成初始表。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
我们说明一下phplib的工作原理,每一个使用phplib的页面首先必须可以找到运行phplib所必须类库文件,我们可以在php3.ini中设置auto_prepend
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
变量来支持,phplib分发包中包含一个prepend.php3文件,将auto_prepend指定为"d:/apache/php/prepend.php3"(带引号)后,各页面就会自动包含phplib类库,我们还可以
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
将phplib类库所在目录加进include变量中,以便可以找到这些文件,当然,最苯的办法就是指定phplib的绝对路径,这可不是个好主意,可移植性太差!
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第二步,每一个使用phplib的页面中,你必须首先调用page_open函数进行初始化。这会告诉phplib,你现在或将来会用到状态保存。一个典型的
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open例子如下:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
数组变量(sess)用来初始化一些状态保存对象,注意:必须使用phplib内置名(sess),这些内置名是你在local.ini中所定义的,page_open
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
函数必须在页面内容输出到浏览器之前被调用。php3脚本最后应以page_close()结束,这将会将有关状态数据写回到数据库中,如果你忘了的话,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
结果你应该能想到,哈哈,你的变量全丢了,可不要怪我没告诉你...
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
因为phplib使用了Cookies来保存状态信息,所以page_open()函数必须在页面内容输出到浏览器之前被调用, 这里的页面内容可以是任何HTML
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
信息或者空行,如果你发现了错误"Oops - SetCookie called after header has been sent",这表明在page_open()之前向浏览器输出了些什么,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
你要特别留意空行,因为非常难找到,典型的错误是在<? 和 ?>标记之间输出了空行,你应检查在local.inc和prepend.php3文件中是否包含了空行,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这也是一个非常容易出错的地方。为了减少出错的可能,我们可以这样书写初始化程序:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
.....
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第三步,具体使用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
当一个用户访问了该网站后,随即用户的session就开始了,如果用户的浏览器支持cookie的话,将会建立一个session的id放入cookie,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个唯一的ID是由PHP3随机生成,然后又用随机种子字串进行md5加密过了的,这里的cookie应该叫做session cookie,因为这个cookie是不会
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
写到用户硬盘里去的,当一个session期结束的时候,该cookie也被完结了。如果用户浏览器不支持cookie的话,那么 该session的id将会放入url链中,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
因为是加密过的,所以窃取了也没用。session ID存放着用户的有关信息,如用户已认证、认证到期时间、用户权限,和其他一些你可能需要的信息,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
方便我们取用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
Session其实就是用户一次会话的过程。Session并不是仅仅用来跟踪用户的注册,实际上,它还可以有其它的使用场合,你可以用它来存储任何你想要
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
存贮的信息,这些信息可以在用户随后访问的页面中派上用场,当然前提是那些页面要使用PHPLIB。方法很简单,注册一个变量后即可在随后的页面中使用它,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
直至session结束。方法:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php $sess->register( "variable_name"); ?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
注意,这里的variable_name不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改变变量的值,随后的页面访问该变量时
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
会得到改变后的值。变量的类型是多样的,可以是一个字串,一个数字,一个数组。举例来说明:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第一页:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$sess->register( "first"); //注意变量名前不需要加$
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (iset($firstname)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$first = $firstname;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
.....
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_close();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第二页:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open();//开始session
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo $first;//看看效果
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_close();//保存状态信息
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果你忘记调用page_close()函数的话,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
变量就不会被写回数据库,将出现不可预知的后果。当变量被使用完毕,你不再需要用到时,可以调用以下函数将变量删除:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
...
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$sess->unregister( "variable_name");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
...
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_close();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
PHPLIB 7.0中,使用了一种存储结构,它允许你存储session数据到数据库中、共享内存中或者LDAP中。PHPLIB使用了数据库类,这使得你有
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
了更多的选择,你可以选用oracle8,mysql,postgresql等等数据库来保存状态信息。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
关于phplib中的其它功能以及有关session的其它函数的使用,你可以参看它带的手册,或上它的网站看在线文档。它的老家在
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
http://phplib.netuse.de/index.php3 。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
php4的session实现大都从phplib学来的,它也靠cookies保存session id,用文件系统保存变量(默认情况下)。因此,它的session
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
变量不能保存对象(事实上能保存对象内容,但没有意义,因为它是保存在磁盘上的,不是活的对象,充其量也就是对象尸体。)不过这点的限制不是太
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
大,我们在大部分情况下都只需要保存变量就行了。当然你也可以将session保存在数据库中,下一小节中我们会讲到怎样将session保存在数据库中。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置选项。下面我们来看看各项的作用与意义:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
[Session]
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.save_handler = files ; handler used to store/retrieve data(用什么保存session变量,默认情况下用文件)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.save_path = c:/temp ; argument passed to save_handler(保存session变量的目录,在linux/unix下为/tmp,在win下设为你的目录)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; in the case of files, this is the
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; path where data files are stored
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.use_cookies = 1 ; whether to use cookies(是否使用cookies,当然,在win下别无选择)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.name = PHPSESSID
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; name of the session(默认session使用的cookies名,建议不要改动)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; is used as cookie name
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.auto_start = 0 ; initialize session on request startup(是否自动启用session,当为1时,在每页中就可以不必调用session_start()函数了)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设定 cookie 送到浏览器后的保存时间,单位为秒。缺省值为 0,表示直到浏览器关闭。)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; or if 0, until browser is restarted
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路径)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.serialize_handler = php ; handler used to serialize data(定义序列化数据的标识,本功能只有 WDDX 模块或 PHP 内部使用。缺省值为 php)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; php is the standard serializer of PHP
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.gc_probability = 1 ; percentual probability that the (设定每次临时文件开始处理 (gc, garbage collection) 处理概率。缺省值为 1。 )
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; ’garbage collection’ process is started
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; on every session initialization
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.gc_maxlifetime = 1440 ; after this number of seconds, stored(设定保存session的临时文件被清除前的存活秒数)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; data will be seen as ’garbage’ and
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; cleaned up by the gc process
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.referer_check = ; check HTTP Referer to invalidate (决定参照到客户端的 Session 代码是否要删除。有时在安全或其它考虑时,会设定不删除。缺省值为 0。)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; externally stored URLs containing ids
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.entropy_length = 0 ; how many bytes to read from the file(设定 session 从高熵值资源读取的位数。缺省值为 0.)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.entropy_file = ; specified here to create the session id(设定 session 代码建立时,使用外部高熵值资源或文件来建立,例如 UNIX 系统上的 /dev/random 或 /dev/urandom。 )
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; session.entropy_length = 16
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; session.entropy_file = /dev/urandom
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cache_limiter = nocache ; set to {nocache,private,public} to (设定session 缓冲限制)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; determine HTTP caching aspects
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cache_expire = 180 ; document expires after n minutes(文档有效期,单位为分钟)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在windows平台下,php4.01pl2以前的版本会出现设置session.save_path 后出错的情况,这是php的一个bug,在php4.01pl2及以后已经修正了。如果你用以前的版本,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
你可以将session.save_path设为"./",或设为"/temp",并在你放置php脚本的当前盘根目录下建一个名为temp的目录即可(我的php脚本放在d:apachehtdocs下,则我在d:盘根目录下建一名为temp的目录)。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在php4中有关session的函数主要有以下这些:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start: 初始化session,需要用session的每一个页面最开始处调用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_destroy: 结束 session,在需要结束session处调。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_name: 存取目前 session 名称。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_module_name: 存取目前 session 模块。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_save_path: 存取目前 session 路径。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_id: 存取目前 session id号。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register: 注册新的session变量。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_unregister: 删除已注册session变量。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_is_registered: 检查session变量是否注册。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_decode: Session 数据解码。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_encode: Session 数据加密。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
通常情况下我们只需要调用三个函数即可。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
即sesssion_start()、session_register()、session_is_registered()。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在需要用到session的每一页的最开始处调用session_start()函数,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
一个典型的使用session的页面如下:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?session_start()?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
....
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<body>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$var="hello";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("var");//注册$var变量,注意没有$符号
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(session_is_registered("var"))//检查变量是否注册
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "haha,注册了!";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
else
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "sorry,还没有注册!";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</body>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
php4中session处理的定制
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
我们需要扩充6个函数,当然这些函数不需你去调用,对我们来说是透明的。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这几个函数是:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_open($sess_path, $session_name);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数被session处理程序调用来作初始化工作。需要传给它的两个参数是$sess_path,它对应你的php.ini文件中的session.save_path
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
选项;$session_name,它对应php.ini中的session.name 选项。它们具体怎样工作,请看下面的例子。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_close();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数在页面结束执行并且session处理程序需要关闭时被调用。(注意,不要和sess_destory混淆了,它是用来结束session的)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_read($key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数在session处理程序读取指定session键值($key)时。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数检索并返回标识为$key的session数据.(注意:你不用担心怎样序列化和反序列化数据,如果你不知道这是什么意思,不要担心它)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
译者注:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_write($key, $val);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数据在session处理程序需要将数据保存时调用,这种情况经常在你的程序结束时发生。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
它负责将数据保存在下次能用sess_read($key)函数检索的地方。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_destroy($key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数在需要消毁session时。它负责删除session并且清除环境。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_gc($maxlifetime);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
现在我们已经清楚了我们提供的函数。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
定制程序可以用mysql数据库或DBM文件保存session数据。取决于你的需要。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
如果你决定使用mysql作支持,那需要作以下工作:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
首先我们在mysql中创建一个sessions数据库,并且创建一个sessions表。先运行你的mysql客户端并且执行下面的命令:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql> CREATE DATABASE sessions;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> IDENTIFIED BY ’phpsession’;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql> CREATE TABLE sessions (
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> sesskey char(32) not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> expiry int(11) unsigned not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> value text not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> PRIMARY KEY (sesskey)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> );
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
(很抱歉,由于版权原因,我不能把以下代码中的英文去掉,只好加些注释了:)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
==================================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* session_mysql.php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PHP4 MySQL Session Handler
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Version 1.00
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* by Ying Zhang ([email protected])
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Last Modified: May 21 2000
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* TERMS OF USAGE:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* You are free to use this library in any way you want, no warranties are
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* expressed or implied. This works for me, but I don’t guarantee that it
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* works for you, USE AT YOUR OWN RISK.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* While not required to do so, I would appreciate it if you would retain
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* this header information. If you make any modifications or improvements,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* please send them via email to Ying Zhang <[email protected]>.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* DEscriptION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* This library tells the PHP4 session handler to write to a MySQL database
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* instead of creating individual files for each session.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Create a new database in MySQL called "sessions" like so:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* CREATE TABLE sessions (
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* sesskey char(32) not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* expiry int(11) unsigned not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* value text not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PRIMARY KEY (sesskey)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* );
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* INSTALLATION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Make sure you have MySQL support compiled into PHP4. Then copy this
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* script to a directory that is accessible by the rest of your PHP
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* scripts.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*确信你的php4有mysql支持,然后把这个脚本拷贝到和你的php脚本有关的目录。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* USAGE:(使用方法)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Include this file in your scripts before you call session_start(), you
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* don’t have to do anything special after that.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*包含这个文件到你要使用session的文件中,必须在调用session_start()之前,否则,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*会很惨的,不要怪我没告诉你。 这样就不需要再做什么工作了,还和你以前用session的方法一样。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*/
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBHOST = "localhost"; /* database server hostname */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBNAME = "sessions"; /* database name */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBUSER = "phpsession"; /* database user */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBPASS = "phpsession"; /* database password */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBH = "";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_open($save_path, $session_name) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Can’t connect to $SESS_DBHOST as $SESS_DBUSER";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>MySQL Error: ", mysql_error();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
die;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Unable to select database $SESS_DBNAME";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
die;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_close() {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_read($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "SELECT value FROM sessions WHERE sesskey = ’$key’ AND expiry > " . time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (list($value) = mysql_fetch_row($qid)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $value;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return false;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_write($key, $val) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$expiry = time() + $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$value = addslashes($val);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "INSERT INTO sessions VALUES (’$key’, $expiry, ’$value’)";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! $qid) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "UPDATE sessions SET expiry = $expiry, value = ’$value’ WHERE sesskey = ’$key’ AND expiry > " . time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $qid;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_destroy($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "DELETE FROM sessions WHERE sesskey = ’$key’";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $qid;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_gc($maxlifetime) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "DELETE FROM sessions WHERE expiry <" . time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return mysql_affected_rows($SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_set_save_handler(
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_open",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_close",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_read",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_write",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_destroy",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_gc");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
定制使用dbm文件时的接口
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* session_dbm.php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PHP4 DBM Session Handler
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Version 1.00
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* by Ying Zhang ([email protected])
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Last Modified: May 21 2000
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* TERMS OF USAGE:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* You are free to use this library in any way you want, no warranties are
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* expressed or implied. This works for me, but I don’t guarantee that it
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* works for you, USE AT YOUR OWN RISK.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* While not required to do so, I would appreciate it if you would retain
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* this header information. If you make any modifications or improvements,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* please send them via email to Ying Zhang <[email protected]>.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* DEscriptION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* This library tells the PHP4 session handler to write to a DBM file
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* instead of creating individual files for each session.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* INSTALLATION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Make sure you have DBM support compiled into PHP4. Then copy this
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* script to a directory that is accessible by the rest of your PHP
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* scripts.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*确信你的php4有DBM支持。拷贝这个文件在你的php脚本目录。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* USAGE:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Include this file in your scripts before you call session_start(), you
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* don’t have to do anything special after that.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* 在调用session_start()之前请包含这个文件。之后就不需要作什么工作了。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*/
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBM = "";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_open($save_path, $session_name) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBM = dbmopen("$save_path/$session_name", "c");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return ($SESS_DBM);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_close() {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
dbmclose($SESS_DBM);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_read($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$var = "";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($tmp = dbmfetch($SESS_DBM, $key)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$expires_at = substr($tmp, 0, strpos($tmp, "|"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($expires_at > time()) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$var = substr($tmp, strpos($tmp, "|") + 1);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $var;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_write($key, $val) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . "|" . $val);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_destroy($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
dbmdelete($SESS_DBM, $key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_gc($maxlifetime) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$now = time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$key = dbmfirstkey($SESS_DBM);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
while ($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($tmp = dbmfetch($SESS_DBM, $key)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$expires_at = substr($tmp, 0, strpos($tmp, "|"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($now > $expires_at) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_destroy($key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$key = dbmnextkey($SESS_DBM, $key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_set_save_handler(
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_open",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_close",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_read",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_write",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_destroy",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_gc");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
具体怎么用就不用多说了,因为这些函数都是php引擎调用的,与我们无关的。我们只需照上述配置后就行了,你用的还是以前的session函数。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
看看下面的代码就知道了:)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session定制的测试代码
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
==================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* test.php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PHP4 Customer Session Handler Test script
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Version 1.00
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* by Ying Zhang ([email protected])
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Last Modified: May 21 2000
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*/
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* default to DBM handler */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! isset($handler)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$handler = "dbm";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* default action is increment */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! isset($action)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$action = "increment";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* load up the appropriate session handling script, depending on the handler */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($handler == "dbm") {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
include("session_dbm.php");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
} elseif ($handler == "mysql") {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
include("session_mysql.php");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
} else {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Unrecognized handler ($handler)";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
die;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* start the session and register a simple counter */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("count");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* figure out what we should do, depending on the action */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
switch ($action) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
case "increment" :
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$count = isset($count) ? $count + 1 : 0;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
case "destroy" :
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_destroy();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
case "gc" :
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$maxlife = get_cfg_var("session.gc_maxlifetime");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_gc($maxlife);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
default:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Unknown action ($action)";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<h1>Session Test script</h1>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<ul>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<li>Handler: <b><?=$handler?></b>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<li>Action: <b><?=$action?></b>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<li>Count: <b><?=$count?></b>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</ul>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<hr size=1>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<form>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<table>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>Handler:</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<select name="handler">
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="dbm">DBM</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="mysql">MySQL</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</select>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>Action:</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<select name="action">
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="increment">Increment</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="destroy">Session Destroy</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="gc">Force Garbage Collection</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</select>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td></td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<input type="submit"></td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</table>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</form>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=======================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
三、session应用举例
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
以下这些例子片断仅供参考,你可以定制也可以不定制session,随你便:)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
(1)用于用户认证
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$dbh = mysql_connect("localhost:3306","xxxx","xxxx");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql_select_db("znsoft");//选择数据库
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$query="select userid from reguser where userid=’$userid’ and pass=’$pass’ ";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
//$userid $pass 是登录form传递过来的用户名和密码
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$res=mysql_query($query,$dbh);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if($row=mysql_fetch($res))
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
{
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$reguser=$row[0];
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
alert("ok,哥们,欢迎你!");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
else
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
{
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$reguser="";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
alert("sorry,你不是注册用户!");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
..............//你自己放上代码吧
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("reguser");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
另一页面中检查是否已经登录
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(isset($reguser)&&$reguser!="")//已经登录
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
{
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "欢迎你,哥们";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
else//没有登录呀
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "请注册吧";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
退出功能
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
===============================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_destroy();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
//或 $reguser="";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
(2)用于传递变量
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
本程序用于在页面之间传递变量
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$name="m.y";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(!sesion_is_registered("name"))//没有注册session变量 name
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("name");//注册 变量 name
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第二页
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
===================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo $name;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
//不想用了,删掉吧
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(session_is_registered("name"))//是否注册,如果已经注册
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_unregister("name");//当然删掉啦
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
四、更多的例子,你自己想吧
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
.......
php爱好者 站 http://www.phpfans.net 网页制作|网站建设|数据采集.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
PHP中session全面教程
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
作者:znsoft
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
一、session概述
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session是什么,刚开始我也不明白,非专业词典翻译为会议,会议期。直到接触asp后才知道session是干什么的,有什么用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
作个不太恰当的比喻吧(虽然不恰当,但意义却是一样的),session就好象你和你女友(或妻子)之间的感情似的,session是你和
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
网站之间的感情。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session在WEB技术中占有非常重要的份量。由于网页是一种无状态的连接程序,因此你无法得知用户的浏览状态。因此我们必须
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
通过session记录用户的有关信息,以供用户再次以此身份对web服务器提供要求时作确认,例如,我们在某些网站中常常要求用户登录,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
但我们怎么知道用户已经登录了呢,如果没有session的话,登录信息是无法保留的,那岂不要让用户在每一页网页中都要提供
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
用户名和密码。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
当然,session不光用于用户身份认证功能,还可能用于其它方面,以后我们会提到的。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session用中文来解释就是会话期。一个会话期开始于用户输入一个站点的网址时,结束于他离开这个站点时。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session最早出现在动态脚本语言Active Server Pages中,它的功能之强大,是一句话无法说清楚的。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
当php还在3.0版本时,session是它永远的痛。虽然php具有执行速度快,使用灵活,功能强大等优点,但因为session的问题,使
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
很多站点的开发放弃了php,至少我的老板是这样认为的。当时有很多php免费函数库提供在php3上实现session的方案,但都让人感觉不正宗。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
就好象你花好几千大洋买的手机却配置一个很粗糙的草作的袋子一样,虽然功能是一样的,但总让人觉得别扭。php4的出现让php在session问题上
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
有了翻身的机会。虽然它的session实现还不是很理想(主要是效率问题),但毕竟是它自己实现的,而且可以实际使用了。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
那我们用session干什么呢,你说了半天,我用不上的话,你岂不有卖纸张之嫌。OK,我们来看看session有什么用:作过网站的人都有
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这样的体会,在一页页面中的变量(在本章都指服务器端变量,下同)是不能在下一页中用的,虽然有一些办法可以实现,比如用form,urlstring等等
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
但有些对于用户来说是不方便的,即使让form自动提交,但其中的延时在现今的网络状况下足以让人窒息,而这两种方法都明显加大程序员的负担。如果你
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
正在开发一个大型项目,那这些额外的负担是不能忽略的。而有了session就好办了,session中注册的变量可以作为全局变量使用。什么,全局变量?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
好极了。这样一来,你知道有什么用了吧:最主要的用于用户身份认证,程序状态记录,页面之间参数传递。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
说了它这么半天的好处,你已经动心了吧,先别高兴,它还有缺点呢:它是用文件保存的变量(当然效率不高了,虽然可以用别的方式,但
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
很麻烦的),不能保存对象。与之相对的是,asp中的session可以保存对象变量,用内存变量来保存session变量。但为什么我们还选用php呢,呵呵,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
为什么,你能从本书的开始看到这章,想必你也应该明白了吧,你还不明白,Faint,你再从头看起吧,我保证你成为PHP专家^_^。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session是怎样实现的呢?呵呵,你一定以为很高深吧,我来告诉你它的秘密。如果说只保存变量的话,很多读者都明白,这是很简单的,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
但前面我们说过,http协议是一种无状态的连接,你怎么知道那个变量是谁的,这个变量又是谁的呢?在session实现中用cookie实现的。cookie
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
存在于客户端,也就是用户的机器中,里面保存着用户的session ID,也就是session号码,当用户的浏览器请求服务器时把session ID也一起送到
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
服务器,这样服务器就可以识别你是谁,也就可以把变量识别开了。这样我们就不难理解了,为什么有时session会失效了。不信的话,你可以试试:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在IE的"工具"菜单上有"Internet选项"菜单,打开后再选"安全"->"自定义级别",将安全设置中的"允许使用每个对话cookies"设为禁用,再看看
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session能不能用。这下明白了吧!不过php4在linux/unix平台上可以自动检查cookies状态,当cookies 不可用时,自动会把session ID
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
附带在url上进行传递。这是它在session方面比asp多的唯一的优点了。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
二、php3,4中session的实现
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在php3中是没有session这种东东的,但我们又需要,怎么办呢?别急,有很多人替你做了这些,这其中最有名的要算phplib了。你可以去国外下
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
载,也可以上国内大部分php站点下载。我们要做的第一件事是让phplib和php3结合在一起使它能工作。为了能实现这方面的功能,我们需要先安装phplib。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
跟着我来做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通过)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
phplib最基本的功能包括用户认证,Session管理,权限及数据库的抽象化。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
怎样使用phplib来实现session功能呢?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
一、首先你将phplib解开,里面有一个目录叫"php",将这个目录拷贝到apache的安装目录下。以下以笔者的机器为例:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
我的apache安装在d:apache 目录下,我将上面的"php"目录拷贝到d:apache,并将phplib下的pages目录下的文件和目录一起拷贝到
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
d:apachehtdocs下,注意不带目录本身。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
phplib的类库需要根据系统进行初始化,你可以修改local.inc文件,其中包含着一些基本参数,你可以根据自己机器的实际情况来进行修改。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
将d:apachephpprepend.php3文件中的一段程序改为如下样子:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$_PHPLIB["libdir"] = "d:/apache/php/"; //这儿改为你放phplib下php目录的路径
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
然后将d:apachephplocal.inc文件改如下:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
class DB_Example extends DB_Sql {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $Host = "localhost";//你的mysql数据库所在主机名
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $Database = "test";//数据库名
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $User = "root";//数据库用户名
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
var $Password = "";//数据库用户口令
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
最后一步执行解开的phplib目录中的stuff目录下的create_database.mysql文件,生成初始表。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
我们说明一下phplib的工作原理,每一个使用phplib的页面首先必须可以找到运行phplib所必须类库文件,我们可以在php3.ini中设置auto_prepend
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
变量来支持,phplib分发包中包含一个prepend.php3文件,将auto_prepend指定为"d:/apache/php/prepend.php3"(带引号)后,各页面就会自动包含phplib类库,我们还可以
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
将phplib类库所在目录加进include变量中,以便可以找到这些文件,当然,最苯的办法就是指定phplib的绝对路径,这可不是个好主意,可移植性太差!
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第二步,每一个使用phplib的页面中,你必须首先调用page_open函数进行初始化。这会告诉phplib,你现在或将来会用到状态保存。一个典型的
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open例子如下:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
数组变量(sess)用来初始化一些状态保存对象,注意:必须使用phplib内置名(sess),这些内置名是你在local.ini中所定义的,page_open
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
函数必须在页面内容输出到浏览器之前被调用。php3脚本最后应以page_close()结束,这将会将有关状态数据写回到数据库中,如果你忘了的话,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
结果你应该能想到,哈哈,你的变量全丢了,可不要怪我没告诉你...
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
因为phplib使用了Cookies来保存状态信息,所以page_open()函数必须在页面内容输出到浏览器之前被调用, 这里的页面内容可以是任何HTML
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
信息或者空行,如果你发现了错误"Oops - SetCookie called after header has been sent",这表明在page_open()之前向浏览器输出了些什么,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
你要特别留意空行,因为非常难找到,典型的错误是在<? 和 ?>标记之间输出了空行,你应检查在local.inc和prepend.php3文件中是否包含了空行,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这也是一个非常容易出错的地方。为了减少出错的可能,我们可以这样书写初始化程序:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
.....
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第三步,具体使用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
当一个用户访问了该网站后,随即用户的session就开始了,如果用户的浏览器支持cookie的话,将会建立一个session的id放入cookie,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个唯一的ID是由PHP3随机生成,然后又用随机种子字串进行md5加密过了的,这里的cookie应该叫做session cookie,因为这个cookie是不会
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
写到用户硬盘里去的,当一个session期结束的时候,该cookie也被完结了。如果用户浏览器不支持cookie的话,那么 该session的id将会放入url链中,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
因为是加密过的,所以窃取了也没用。session ID存放着用户的有关信息,如用户已认证、认证到期时间、用户权限,和其他一些你可能需要的信息,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
方便我们取用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
Session其实就是用户一次会话的过程。Session并不是仅仅用来跟踪用户的注册,实际上,它还可以有其它的使用场合,你可以用它来存储任何你想要
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
存贮的信息,这些信息可以在用户随后访问的页面中派上用场,当然前提是那些页面要使用PHPLIB。方法很简单,注册一个变量后即可在随后的页面中使用它,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
直至session结束。方法:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php $sess->register( "variable_name"); ?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
注意,这里的variable_name不是变量值,而是变量名,可以先指定变量名,随后再赋值。你在某个页面中可以改变变量的值,随后的页面访问该变量时
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
会得到改变后的值。变量的类型是多样的,可以是一个字串,一个数字,一个数组。举例来说明:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第一页:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$sess->register( "first"); //注意变量名前不需要加$
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (iset($firstname)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$first = $firstname;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
.....
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_close();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第二页:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open();//开始session
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo $first;//看看效果
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_close();//保存状态信息
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。如果你忘记调用page_close()函数的话,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
变量就不会被写回数据库,将出现不可预知的后果。当变量被使用完毕,你不再需要用到时,可以调用以下函数将变量删除:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_open(array("sess" => "Example_Session"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
...
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$sess->unregister( "variable_name");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
...
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
page_close();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
PHPLIB 7.0中,使用了一种存储结构,它允许你存储session数据到数据库中、共享内存中或者LDAP中。PHPLIB使用了数据库类,这使得你有
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
了更多的选择,你可以选用oracle8,mysql,postgresql等等数据库来保存状态信息。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
关于phplib中的其它功能以及有关session的其它函数的使用,你可以参看它带的手册,或上它的网站看在线文档。它的老家在
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
http://phplib.netuse.de/index.php3 。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
php4的session实现大都从phplib学来的,它也靠cookies保存session id,用文件系统保存变量(默认情况下)。因此,它的session
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
变量不能保存对象(事实上能保存对象内容,但没有意义,因为它是保存在磁盘上的,不是活的对象,充其量也就是对象尸体。)不过这点的限制不是太
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
大,我们在大部分情况下都只需要保存变量就行了。当然你也可以将session保存在数据库中,下一小节中我们会讲到怎样将session保存在数据库中。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置选项。下面我们来看看各项的作用与意义:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
[Session]
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.save_handler = files ; handler used to store/retrieve data(用什么保存session变量,默认情况下用文件)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.save_path = c:/temp ; argument passed to save_handler(保存session变量的目录,在linux/unix下为/tmp,在win下设为你的目录)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; in the case of files, this is the
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; path where data files are stored
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.use_cookies = 1 ; whether to use cookies(是否使用cookies,当然,在win下别无选择)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.name = PHPSESSID
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; name of the session(默认session使用的cookies名,建议不要改动)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; is used as cookie name
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.auto_start = 0 ; initialize session on request startup(是否自动启用session,当为1时,在每页中就可以不必调用session_start()函数了)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设定 cookie 送到浏览器后的保存时间,单位为秒。缺省值为 0,表示直到浏览器关闭。)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; or if 0, until browser is restarted
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路径)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.serialize_handler = php ; handler used to serialize data(定义序列化数据的标识,本功能只有 WDDX 模块或 PHP 内部使用。缺省值为 php)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; php is the standard serializer of PHP
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.gc_probability = 1 ; percentual probability that the (设定每次临时文件开始处理 (gc, garbage collection) 处理概率。缺省值为 1。 )
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; ’garbage collection’ process is started
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; on every session initialization
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.gc_maxlifetime = 1440 ; after this number of seconds, stored(设定保存session的临时文件被清除前的存活秒数)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; data will be seen as ’garbage’ and
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; cleaned up by the gc process
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.referer_check = ; check HTTP Referer to invalidate (决定参照到客户端的 Session 代码是否要删除。有时在安全或其它考虑时,会设定不删除。缺省值为 0。)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; externally stored URLs containing ids
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.entropy_length = 0 ; how many bytes to read from the file(设定 session 从高熵值资源读取的位数。缺省值为 0.)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.entropy_file = ; specified here to create the session id(设定 session 代码建立时,使用外部高熵值资源或文件来建立,例如 UNIX 系统上的 /dev/random 或 /dev/urandom。 )
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; session.entropy_length = 16
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; session.entropy_file = /dev/urandom
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cache_limiter = nocache ; set to {nocache,private,public} to (设定session 缓冲限制)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
; determine HTTP caching aspects
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session.cache_expire = 180 ; document expires after n minutes(文档有效期,单位为分钟)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在windows平台下,php4.01pl2以前的版本会出现设置session.save_path 后出错的情况,这是php的一个bug,在php4.01pl2及以后已经修正了。如果你用以前的版本,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
你可以将session.save_path设为"./",或设为"/temp",并在你放置php脚本的当前盘根目录下建一个名为temp的目录即可(我的php脚本放在d:apachehtdocs下,则我在d:盘根目录下建一名为temp的目录)。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在php4中有关session的函数主要有以下这些:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start: 初始化session,需要用session的每一个页面最开始处调用。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_destroy: 结束 session,在需要结束session处调。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_name: 存取目前 session 名称。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_module_name: 存取目前 session 模块。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_save_path: 存取目前 session 路径。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_id: 存取目前 session id号。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register: 注册新的session变量。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_unregister: 删除已注册session变量。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_is_registered: 检查session变量是否注册。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_decode: Session 数据解码。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_encode: Session 数据加密。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
通常情况下我们只需要调用三个函数即可。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
即sesssion_start()、session_register()、session_is_registered()。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
在需要用到session的每一页的最开始处调用session_start()函数,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
一个典型的使用session的页面如下:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?session_start()?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
....
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<body>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$var="hello";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("var");//注册$var变量,注意没有$符号
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(session_is_registered("var"))//检查变量是否注册
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "haha,注册了!";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
else
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "sorry,还没有注册!";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</body>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</html>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
php4中session处理的定制
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
我们需要扩充6个函数,当然这些函数不需你去调用,对我们来说是透明的。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这几个函数是:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_open($sess_path, $session_name);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数被session处理程序调用来作初始化工作。需要传给它的两个参数是$sess_path,它对应你的php.ini文件中的session.save_path
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
选项;$session_name,它对应php.ini中的session.name 选项。它们具体怎样工作,请看下面的例子。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_close();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数在页面结束执行并且session处理程序需要关闭时被调用。(注意,不要和sess_destory混淆了,它是用来结束session的)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_read($key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数在session处理程序读取指定session键值($key)时。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数检索并返回标识为$key的session数据.(注意:你不用担心怎样序列化和反序列化数据,如果你不知道这是什么意思,不要担心它)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
译者注:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_write($key, $val);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数据在session处理程序需要将数据保存时调用,这种情况经常在你的程序结束时发生。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
它负责将数据保存在下次能用sess_read($key)函数检索的地方。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_destroy($key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数在需要消毁session时。它负责删除session并且清除环境。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_gc($maxlifetime);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
现在我们已经清楚了我们提供的函数。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
定制程序可以用mysql数据库或DBM文件保存session数据。取决于你的需要。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
如果你决定使用mysql作支持,那需要作以下工作:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
首先我们在mysql中创建一个sessions数据库,并且创建一个sessions表。先运行你的mysql客户端并且执行下面的命令:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql> CREATE DATABASE sessions;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> IDENTIFIED BY ’phpsession’;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql> CREATE TABLE sessions (
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> sesskey char(32) not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> expiry int(11) unsigned not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> value text not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> PRIMARY KEY (sesskey)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
-> );
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
(很抱歉,由于版权原因,我不能把以下代码中的英文去掉,只好加些注释了:)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
==================================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* session_mysql.php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PHP4 MySQL Session Handler
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Version 1.00
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* by Ying Zhang ([email protected])
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Last Modified: May 21 2000
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* TERMS OF USAGE:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* You are free to use this library in any way you want, no warranties are
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* expressed or implied. This works for me, but I don’t guarantee that it
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* works for you, USE AT YOUR OWN RISK.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* While not required to do so, I would appreciate it if you would retain
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* this header information. If you make any modifications or improvements,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* please send them via email to Ying Zhang <[email protected]>.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* DEscriptION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* This library tells the PHP4 session handler to write to a MySQL database
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* instead of creating individual files for each session.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Create a new database in MySQL called "sessions" like so:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* CREATE TABLE sessions (
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* sesskey char(32) not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* expiry int(11) unsigned not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* value text not null,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PRIMARY KEY (sesskey)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* );
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* INSTALLATION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Make sure you have MySQL support compiled into PHP4. Then copy this
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* script to a directory that is accessible by the rest of your PHP
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* scripts.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*确信你的php4有mysql支持,然后把这个脚本拷贝到和你的php脚本有关的目录。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* USAGE:(使用方法)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Include this file in your scripts before you call session_start(), you
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* don’t have to do anything special after that.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*包含这个文件到你要使用session的文件中,必须在调用session_start()之前,否则,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*会很惨的,不要怪我没告诉你。 这样就不需要再做什么工作了,还和你以前用session的方法一样。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*/
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBHOST = "localhost"; /* database server hostname */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBNAME = "sessions"; /* database name */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBUSER = "phpsession"; /* database user */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBPASS = "phpsession"; /* database password */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBH = "";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_open($save_path, $session_name) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Can’t connect to $SESS_DBHOST as $SESS_DBUSER";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>MySQL Error: ", mysql_error();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
die;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Unable to select database $SESS_DBNAME";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
die;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_close() {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_read($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "SELECT value FROM sessions WHERE sesskey = ’$key’ AND expiry > " . time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (list($value) = mysql_fetch_row($qid)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $value;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return false;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_write($key, $val) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$expiry = time() + $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$value = addslashes($val);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "INSERT INTO sessions VALUES (’$key’, $expiry, ’$value’)";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! $qid) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "UPDATE sessions SET expiry = $expiry, value = ’$value’ WHERE sesskey = ’$key’ AND expiry > " . time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $qid;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_destroy($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "DELETE FROM sessions WHERE sesskey = ’$key’";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $qid;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_gc($maxlifetime) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBH;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qry = "DELETE FROM sessions WHERE expiry <" . time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$qid = mysql_query($qry, $SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return mysql_affected_rows($SESS_DBH);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_set_save_handler(
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_open",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_close",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_read",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_write",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_destroy",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_gc");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
定制使用dbm文件时的接口
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* session_dbm.php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PHP4 DBM Session Handler
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Version 1.00
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* by Ying Zhang ([email protected])
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Last Modified: May 21 2000
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* TERMS OF USAGE:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* You are free to use this library in any way you want, no warranties are
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* expressed or implied. This works for me, but I don’t guarantee that it
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* works for you, USE AT YOUR OWN RISK.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* While not required to do so, I would appreciate it if you would retain
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* this header information. If you make any modifications or improvements,
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* please send them via email to Ying Zhang <[email protected]>.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* DEscriptION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* This library tells the PHP4 session handler to write to a DBM file
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* instead of creating individual files for each session.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* INSTALLATION:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Make sure you have DBM support compiled into PHP4. Then copy this
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* script to a directory that is accessible by the rest of your PHP
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* scripts.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*确信你的php4有DBM支持。拷贝这个文件在你的php脚本目录。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* USAGE:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Include this file in your scripts before you call session_start(), you
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* don’t have to do anything special after that.
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* 在调用session_start()之前请包含这个文件。之后就不需要作什么工作了。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*/
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBM = "";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_open($save_path, $session_name) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$SESS_DBM = dbmopen("$save_path/$session_name", "c");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return ($SESS_DBM);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_close() {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
dbmclose($SESS_DBM);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_read($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$var = "";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($tmp = dbmfetch($SESS_DBM, $key)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$expires_at = substr($tmp, 0, strpos($tmp, "|"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($expires_at > time()) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$var = substr($tmp, strpos($tmp, "|") + 1);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return $var;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_write($key, $val) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM, $SESS_LIFE;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . "|" . $val);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_destroy($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
dbmdelete($SESS_DBM, $key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
return true;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
function sess_gc($maxlifetime) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
global $SESS_DBM;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$now = time();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$key = dbmfirstkey($SESS_DBM);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
while ($key) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($tmp = dbmfetch($SESS_DBM, $key)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$expires_at = substr($tmp, 0, strpos($tmp, "|"));
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($now > $expires_at) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_destroy($key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$key = dbmnextkey($SESS_DBM, $key);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_set_save_handler(
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_open",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_close",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_read",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_write",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_destroy",
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
"sess_gc");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
具体怎么用就不用多说了,因为这些函数都是php引擎调用的,与我们无关的。我们只需照上述配置后就行了,你用的还是以前的session函数。
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
看看下面的代码就知道了:)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session定制的测试代码
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
==================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* test.php
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* ------------------------------------------------------------------------
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* PHP4 Customer Session Handler Test script
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Version 1.00
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* by Ying Zhang ([email protected])
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
* Last Modified: May 21 2000
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
*/
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* default to DBM handler */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! isset($handler)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$handler = "dbm";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* default action is increment */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if (! isset($action)) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$action = "increment";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* load up the appropriate session handling script, depending on the handler */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if ($handler == "dbm") {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
include("session_dbm.php");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
} elseif ($handler == "mysql") {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
include("session_mysql.php");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
} else {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Unrecognized handler ($handler)";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
die;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* start the session and register a simple counter */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("count");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
/* figure out what we should do, depending on the action */
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
switch ($action) {
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
case "increment" :
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$count = isset($count) ? $count + 1 : 0;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
case "destroy" :
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_destroy();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
case "gc" :
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$maxlife = get_cfg_var("session.gc_maxlifetime");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
sess_gc($maxlife);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
default:
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "<li>Unknown action ($action)";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
break;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<h1>Session Test script</h1>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<ul>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<li>Handler: <b><?=$handler?></b>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<li>Action: <b><?=$action?></b>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<li>Count: <b><?=$count?></b>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</ul>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<hr size=1>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<form>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<table>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>Handler:</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<select name="handler">
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="dbm">DBM</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="mysql">MySQL</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</select>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>Action:</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<select name="action">
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="increment">Increment</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="destroy">Session Destroy</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<option value="gc">Force Garbage Collection</option>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</select>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td></td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<input type="submit"></td>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</tr>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</table>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</form>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
=======================================================================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
三、session应用举例
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
以下这些例子片断仅供参考,你可以定制也可以不定制session,随你便:)
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
(1)用于用户认证
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$dbh = mysql_connect("localhost:3306","xxxx","xxxx");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
mysql_select_db("znsoft");//选择数据库
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$query="select userid from reguser where userid=’$userid’ and pass=’$pass’ ";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
//$userid $pass 是登录form传递过来的用户名和密码
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$res=mysql_query($query,$dbh);
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if($row=mysql_fetch($res))
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
{
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$reguser=$row[0];
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
alert("ok,哥们,欢迎你!");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
else
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
{
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$reguser="";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
alert("sorry,你不是注册用户!");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
</script>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
..............//你自己放上代码吧
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("reguser");
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
另一页面中检查是否已经登录
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_start();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(isset($reguser)&&$reguser!="")//已经登录
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
{
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "欢迎你,哥们";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
}
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
else//没有登录呀
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo "请注册吧";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
退出功能
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
===============================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_destroy();
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
//或 $reguser="";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
(2)用于传递变量
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
本程序用于在页面之间传递变量
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
$name="m.y";
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(!sesion_is_registered("name"))//没有注册session变量 name
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_register("name");//注册 变量 name
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
第二页
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
===================
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
<?
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
echo $name;
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
//不想用了,删掉吧
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
if(session_is_registered("name"))//是否注册,如果已经注册
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
session_unregister("name");//当然删掉啦
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
?>
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
四、更多的例子,你自己想吧
chi na it p owe r .comhckIiTi6Vee1jIQboMuasR3Cu
.......
php爱好者 站 http://www.phpfans.net 网页制作|网站建设|数据采集.
相关阅读 更多 +