session是什么 & PHP使用session

session是什么

截取自:http://www.hackervip.com/Article/HTML/11744.html

PHP中session全面教程
作者:znsoft

一、session概述

session在WEB技术中占有非常重要的份量。由于网页是一种无状态的连接程序,因此你无法得知用户的浏览状态。因此我们必须

通过session记录用户的有关信息,以供用户再次以此身份对web服务器提供要求时作确认,例如,我们在某些网站中常常要求用户登录,

但我们怎么知道用户已经登录了呢,如果没有session的话,登录信息是无法保留的,那岂不要让用户在每一页网页中都要提供

用户名和密码。

当然,session不光用于用户身份认证功能,还可能用于其它方面,以后我们会提到的。

session用中文来解释就是会话期。一个会话期开始于用户输入一个站点的网址时,结束于他离开这个站点时。

session最早出现在动态脚本语言Active Server Pages中,它的功能之强大,是一句话无法说清楚的。

作过网站的人都有这样的体会,在一页页面中的变量(在本章都指服务器端变量,下同)是不能在下一页中用的,

虽然有一些办法可以实现,比如用form,urlstring等等 ,但有些对于用户来说是不方便的,即使让form自动提交,但其中的延时在现今的网络状况下足以让人窒息,而这两种方法都明显加大程序员的负担。如果你正在开发一个大型项目,那这些额外的负担是不能忽略的。而有了session就好办了,session中注册的变量可以作为全局变量使用。

什么,全局变量? 好极了。这样一来,你知道有什么用了吧:最主要的用于用户身份认证,程序状态记录,页面之间参数传递。

说了它这么半天的好处,你已经动心了吧,先别高兴,它还有缺点呢:它是用文件保存的变量(当然效率不高了,虽然可以用别的方式,但

很麻烦的),不能保存对象。与之相对的是,asp中的session可以保存对象变量,用内存变量来保存session变量。但为什么我们还选用php呢?????

session是怎样实现的呢?如果说只保存变量的话,很多读者都明白,这是很简单的,但前面我们说过,http协议是一种无状态的连接,

你怎么知道那个变量是谁的,这个变量又是谁的呢?在session实现中用cookie实现的。cookie

存在于客户端,也就是用户的机器中,里面保存着用户的session ID,也就是session号码,当用户的浏览器请求服务器时把session ID也一起送到服务器,这样服务器就可以识别你是谁,也就可以把变量识别开了。这样我们就不难理解了,为什么有时session会失效了。不信的话,你可以试试:          在IE的"工具"菜单上有"Internet选项"菜单,打开后再选"安全"->"自定义级别",将安全设置中的"允许使用每个对话cookies"设为禁用,再看看session能不能用。这下明白了吧!不过php4在linux/unix平台上可以自动检查cookies状态,当cookies 不可用时,自动会把session ID附带在url上进行传递。这是它在session方面比asp多的唯一的优点了。

 

二、php4中session的实现

 php3:

当一个用户访问了该网站后,随即用户的session就开始了,如果用户的浏览器支持cookie的话,将会建立一个session的id放入cookie,

这个唯一的ID是由PHP3随机生成,然后又用随机种子字串进行md5加密过了的,这里的cookie应该叫做session cookie,因为这个cookie是不会写到用户硬盘里去的,当一个session期结束的时候,该cookie也被完结了。如果用户浏览器不支持cookie的话,那么 该session的id将会放入url链中,因为是加密过的,所以窃取了也没用。session ID存放着用户的有关信息,如用户已认证、认证到期时间、用户权限,和其他一些你可能需要的信息,方便我们取用。

Session其实就是用户一次会话的过程。Session并不是仅仅用来跟踪用户的注册,实际上,它还可以有其它的使用场合,你可以用它来存储任何你想要存贮的信息,这些信息可以在用户随后访问的页面中派上用场,当然前提是那些页面要使用PHPLIB。方法很简单,注册一个变量后即可在随后的页面中使用它, 直至session结束。

 

关于phplib中的其它功能以及有关session的其它函数的使用,你可以参看它带的手册,或上它的网站看在线文档。它的老家在

http://phplib.netuse.de/index.php3

php4:

php4的session实现大都从phplib学来的,它也靠cookies保存session id,用文件系统保存变量(默认情况下)。因此,它的session

变量不能保存对象(事实上能保存对象内容,但没有意义,因为它是保存在磁盘上的,不是活的对象,充其量也就是对象尸体。)不过这点的限制不是太大,我们在大部分情况下都只需要保存变量就行了。

在php4中由于比php3多了session支持,所以在php.ini文件中也多了session配置选项

下面我们来看看各项的作用与意义:

[Session]

session.save_handler = files ; handler used to store/retrieve data(用什么保存session变量,默认情况下用文件)

session.save_path = c:/temp ; argument passed to save_handler(保存session变量的目录,在linux/unix下为/tmp,在win下设为你的目录)

; in the case of files, this is the

; path where data files are stored

session.use_cookies = 1 ; whether to use cookies(是否使用cookies,当然,在win下别无选择)

session.name = PHPSESSID

; name of the session(默认session使用的cookies名,建议不要改动)

; is used as cookie name

session.auto_start = 0 ; initialize session on request startup(是否自动启用session,当为1时,在每页中就可以不必调用session_start()函数了)

session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设定 cookie 送到浏览器后的保存时间,单位为秒。缺省值为 0,表示直到浏览器关闭。)

; or if 0, until browser is restarted

session.cookie_path = / ; the path the cookie is valid for(cookie)(cookies有效路径)

session.cookie_domain = ; the domain the cookie is valid for(cookies有效域名)

session.serialize_handler = php ; handler used to serialize data(定义序列化数据的标识,本功能只有 WDDX 模块或 PHP 内部使用。缺省值为 php)

; php is the standard serializer of PHP

session.gc_probability = 1 ; percentual probability that the (设定每次临时文件开始处理 (gc, garbage collection) 处理概率。缺省值为 1。 )

; ’garbage collection’ process is started

; on every session initialization

session.gc_maxlifetime = 1440 ; after this number of seconds, stored(设定保存session的临时文件被清除前的存活秒数)

; data will be seen as ’garbage’ and

; cleaned up by the gc process

session.referer_check = ; check HTTP Referer to invalidate (决定参照到客户端的 Session 代码是否要删除。有时在安全或其它考虑时,会设定不删除。缺省值为 0。)

; externally stored URLs containing ids

session.entropy_length = 0 ; how many bytes to read from the file(设定 session 从高熵值资源读取的位数。缺省值为 0.)

session.entropy_file = ; specified here to create the session id(设定 session 代码建立时,使用外部高熵值资源或文件来建立,例如 UNIX 系统上的 /dev/random 或 /dev/urandom。 )

; session.entropy_length = 16

; session.entropy_file = /dev/urandom

session.cache_limiter = nocache ; set to {nocache,private,public} to (设定session 缓冲限制)

; determine HTTP caching aspects

session.cache_expire = 180 ; document expires after n minutes(文档有效期,单位为分钟)

 

在php4中有关session的函数主要有以下这些:

 

session_start: 初始化session,需要用session的每一个页面最开始处调用。

session_destroy: 结束 session,在需要结束session处调。

session_name: 存取目前 session 名称。

session_module_name: 存取目前 session 模块。

session_save_path: 存取目前 session 路径。

session_id: 存取目前 session id号。

session_register: 注册新的session变量。

session_unregister: 删除已注册session变量。

session_is_registered: 检查session变量是否注册。

session_decode: Session 数据解码。

session_encode: Session 数据加密。

PHP使用session

 

截取自:http://blog.csdn.net/sayigood/archive/2009/11/22/4850480.aspx

默认情况下使用客户端cookie。客户端Cookie被禁用时会自动通过Query_String传递。
Php
处理会话的函数一共有11个。
1
session_start
函数功能:开始一个会话或者返回已经存在的会话。
函数原型:boolean session_start(void);
返回值:布尔值
功能说明:没有参数且返回值均为true。在这个函数之前不能有任何输出,否则会报警。

2 session_register
函数功能:登记一个新的变量为会话变量
函数原型:boolean session_register(string name);
返回值:布尔值。
功能说明:在全局变量中增加一个变量到当前SESSION,参数name为要加入的变量名,成功则返回true。可以用$_SESSION[name]$HTTP_SESSION_VARS[name]的形式来取值或赋值。
3
session_is_registered
函数功能:检查变量是否被登记为会话变量。
函数原型:boobean session_is_registered(string name);
返回值:布尔值
功能说明:参数name为要检查的变量名。成功则返回true
4
session_unregister
函数功能:删除已注册的变量。
函数原型:boolean session_session_unregister(string name);
返回值:布尔值
功能说明:name为要删除的变量名,成功则返回true.
5
Session_destroy
函数功能:结束当前的会话,并清空会话中的所有资源。
函数原型:boolean session destroy(void);
返回值:布尔值。
功能说明:此函数没有参数,返回值均为true
6 session_encode
函数功能:sesssion信息编码
函数原型:string session_encode(void);
返回值:字符串
功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。
7
session_decode
函数功能:sesssion信息解码
函数原型:boolean session_decode (string data)
返回值:布尔值
功能说明:这个函数可将session信息解码,成功则返回逻辑值true
8
session_name
函数功能:存取当前会话名称
函数原型:boolean session_name(string [name]);
返回值:字符串
功能说明:这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name
9
session_id
函数功能:存取当前会话标识号
函数原型:boolean session_id(string [id]);
返回值:字符串
功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id
10
session_unset
函数功能:删除所有已注册的变量。
函数原型:void session_unset (void)
返回值:布尔值
功能说明:如同多次的session_unregister

 

在社区、论坛中,我们常能看到当前在线的会员,使访问者有宾至如归之感。但这种程序是怎么做出来的呢?
流程如下:
建表user,保存注册用户信息。
create table user(
userid           Int(10)
auto_increment ,
username     Varchar(50)
用户匿称
userpwd       Varchar(50)
密码
email           Varchar(50)
电子信箱
oicq              Varchar(50) OICQ

signature       mediumtext
签名
imgurl            Varchar(50) 
头像
joindate         Varchar(50) 
加入时间

)
建类文件user.php 定义函数
exist($username)
确认新注册用户是不是已经存在
insert($username,$userpwd,$email,$oicq,$imgurl,$signature)
插入注册用户
update($userid,$username,$userpwd,$email,$oicq,$imgurl,$signature)
更新用户数据
get_from_condition($con)
返回满足查询条件的记录集
建表session。当用户登录时即向此表插入新记录,离开或超时后删除记录,保证表中保存的是当前在线的用户。 create table session(

sessionid    Int(10)  序列号 auto_increment 关键字
userid          Int(10) 
用户序列号取自user
ipaddress   Varchar(50)   Ip
地址

lastactivity   Int(10) 最后活动时间,用它来判断用户是否还在线

)
建类文件session.php 定义函数
insert($userid,$ipaddress,$lastactivity)
把登录成功的用户插入到表中
update($userid,$ipaddress,$lastactivity)
更新在线用户最后活动时间
del($con)
删除满足条件的用户,用它来清除离线用户
get_from_condition($con)
返回满足查询条件的记录集
公用文件global.php
include "class/config.inc.php"; //
把配置文件包含进来
$db = new db;
$db-> db_connect( ); //
连接数据库
$user = new user; //
初始化
$session = new session;
//
启动会话
session_start();
//
删除session表中已经过期的用户(即非在线网友)因为此文件总是被调用从而保证显示的都是当前在线的用户
$curtime=time();
$con="lastactivity<$curtime";
$session->del($con);
//
正在线的网友需不断更新session表中的lastactivity时间,并重新设置用户的COOKIES
if ($HTTP_SESSION_VARS["online"]=="on"){ //
此处也可用$_SESSION[“online”]
$userid=$HTTP_SESSION_VARS["userid"]; //
取当前在线用户的userid
$ipaddress=substr($REMOTE_ADDR,0,50);
$lastactivity=time()+3600; //
更新最后活动时间,如时一个小时之内未调动页面就认为用户已离线,从而会被删除。
$session->update($userid,$ipaddress,$lastactivity);
}else{
//
如果未登录那直接转入登录页面
$firstpage="logon.php";
header ("Location: $firstpage");
exit;
}
登录文件logon.php
if ($hiddenField=="0"){ //
测检表单有未被提交
$con="username='$username' and userpwd='$userpwd'";
$result=$user->get_from_condition($con);
if ($user->counter==1){
if (!session_is_registered("online")){//
检测是否被登记过
session_register("online"); //
登记一个新的变量为会话变量
}
if (!session_is_registered("ccauser")){
session_register("ccauser");
}
if (!session_is_registered("userid")){
session_register("userid");
}
$ccauser=$username; //
给会话变量赋值
$online="on"; //
这个变量在global.php用到以更新最后活动时间lastactivity
$userid=$user->userid;
$ipaddress=substr($REMOTE_ADDR,0,50);
$lastactivity=time()+3600;
$con=" userid=$userid";
$session->get_from_condition($con);
//
判断会话是否存在,有可能你在不同的机器上登两次。
if ($session->counter==1){
$session->update($userid,$ipaddress,$lastactivity); //
如存在,更新
}else{
$session->insert($userid,$ipaddress,$lastactivity); //
如不存在,插入
}
//
在客户机设置COOKIES
SetCookie("ccauser",$username,time()+3600);
Header("Location:test.php");//
然后导向测试页
}
}
?>
if($HTTP_SESSION_VARS["online"]=="") { //
判断是否已登录
?>
//
下面是登录的表单
名称:  
密码:  
}else{
echo "
网友:".$HTTP_COOKIE_VARS["ccauser"]."你已经登录了"; //如果已登录则显示提示
$str="
[url=exit.php]
退出社区[/url]";
echo $str;
}
?>
测试文件test.php
include "global.php"; //
global.php文件包含进来
$strWelcome="
欢迎[color=red]".$_SESSION['ccauser']."[/color]
";
echo $strWelcome; //
显示欢迎信息
$str=”
当前在线用户:
===================
”;
$con=" 1=1";
//
提出session表中所有记录即是当前在线用户,未把游客算在内
$result=$session->get_from_condition($con);
while($row=mysql_fetch_array($result)){
$con1="userid=$row[userid]";
$user->get_from_condition($con1);
$str.=$user->username." ";
}
echo $str;
?>
[url=exit.php]
退出社区[/url]
退出文件exit.php
include "global.php"; //
global.php文件包含进来
if ($_SESSION["online"]=="on"){
$con="userid=$userid";
$session->del($con); //
session表中删除用户信息。
session_destroy(); //
结束当前的会话,并清空会话中的所有资源
echo "
已经退出社区......";
}
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值