session的了解及使用
Posted yanpeng2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了session的了解及使用相关的知识,希望对你有一定的参考价值。
session的定义:
Session 译为“会话”,其本意是指有始有终的一系列动作/消息。如打电话时从拿起电话拨号到挂断电话这一系列过程可以称为一个 Session。
在计算机术语中,Session 是指一个终端用户与交互系统进行通信的时间间隔通常指从注册进入系统到注销退出系统所经过的时间。因此,Session 实际上是一个特定的时间概念。
session的工作原理:
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,php从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
使用方法
Session是用于保持状态的基于 Web服务器的方法。Session允许通过将对象存储在Web服务器的内存中在整个用户会话过程中保持任何对象。
Session通常用于执行以下操作
存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览Web应用程序时需要的其它信息。
存储只需要在页重新加载过程中或按功能分组的一组页之间保持其状态的对象。
Session的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何页访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像PDA 或手机这样的浏览器设备。
持久性方法的限制
随着越来越多用户登录,Session所需要的服务器内存量也会不断增加。
访问 Web应用程序的每个用户都生成一个单独的Session 对象。每个Session 对象的持续时间是用户访问的时间加上不活动的时间。
如果每个Session 中保持许多对象,并且许多用户同时使用Web应用程序(创建许多Session),则用于Session 持久性的服务器内存量可能会很大,从而影响了可伸缩性。
解决方法
那什么是Session的解决方案呢?我们知道,用户访问一个网站时往往需要浏览许多网页。Session的使用在不同的语言中的使用方法特点不尽相同。对于一个通过PHP构筑的网站来说,用户在访问的过程中需要执行许多的PHP脚本。然而由于HTTP协议自身的特点,用户每执行一个PHP脚本都需要和Web服务器重新建立连接。
又由于无状态记忆的特点,此次连接无法得到上次连接的状态。这样,用户在一个PHP脚本中对一个变量进行了赋值操作,而在另外一个PHP脚本中却无法得到这个变量的值。例如,用户在负责登录的PHP脚本中设置了$user="wind",却无法在另一个PHP脚本中通过调用$user来获得“wind”这个值。也就是说,在PHP中无法设置全局变量。每个PHP脚本中所定义的变量都是只在这个脚本内有效的局部变量。
Session解决方案,就是要提供在PHP脚本中定义全局变量的方法,使得这个全局变量在同一个Session中对于所有的PHP脚本都有效。上面我们提到了,Session不是一个简单的时间概念,一个Session中还包括了特定的用户和服务器。因此更详细地讲,在一个Session定义的全局变量的作用范围,是指这个Session所对应的用户所访问的所有PHP。
例如A用户通过Session定义了一个全局变量$user=“wind”中,而B用户通过Session定义的全局变量$user=“jane”。那么在A用户所访问的PHP脚本中,$user的值就是wind。
Session数据有效期
只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是整体失效的。
Session与Cookie的区别
在PHP开发中对比起Cookie,session是存储在服务器端的会话,相对安全,并且不像Cookie 那样有存储长度限制,本文简单介绍session 的使用。[3]
由于Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改Session 内容。实际上在服务器端的Session 文件,PHP自动修改session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。
对于 Cookie来说,假设我们要验证用户是否登陆,就必须在Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能只做一次验证。为什么呢?因为客户端Cookie中的信息是有可能被修改的。假如你存储$admin变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin变量那不是就立即取的了管理权限么?非常的不安全。
而Session 就不同了,Session是存储在服务器端的,远程用户没办法修改session 文件的内容,因此我们可以单纯存储一个$admin变量来判断是否登陆,首次验证通过后设置$admin 值为true,以后判断该值是否为true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证Cookie 而传递密码的不安全性了(session验证只需要传递一次,假如你没有使用SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。
Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运行这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串。
这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用。
// 启动会话,这步必不可少
session_start();
//这种方法是将原来注册的某个变量销毁
unset($_SESSION["admin"]);
session_destroy();
删除当前用户对应的session文件以及释放sessionid,内存中的$_SESSION变量内容依然保留
其实Session 还提供了一个函数session_set_cookie_params(); 来设置Session 的生存期的,该函数必须在session_start()函数调用之前调用:
对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置 Session 文件的保存路径,session_save_path()就提供了这样一个功能。我们可以将 session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。该函数也必须在session_start()函数调用之前调用。
要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):
1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
以上是关于session的了解及使用的主要内容,如果未能解决你的问题,请参考以下文章