基础知识之session

来源:互联网 发布:动画演示软件 编辑:程序博客网 时间:2024/05/21 09:27

1.session原理

HTTP是无状态协议,也就是说HTTP协议没有一个内建的机制来维护两个事务之间的状态。当一个用户在请求一个页面后再去请求另外一个页面时,HTTP将无法告诉我们这两个请求是来自同一个用户。由此我们就会觉得很奇怪了,平时我们在论坛逛帖子或电商网站购物时,只要我们在这个站点内,不论我们怎么跳转,从一个页面跑到另一个页面,网站总会记得我是谁,比如告诉你购买了哪些东西。这是怎么做到的呢,估计大家猜到了,就是运用本文中提到的会话控制。

会话控制

1 什么是会话web中的会话实际上是指浏览器和web服务器之间的会话,形象一点:就好比两个人进行一段对话。会话控制就是跟踪和识别用户信息的机制

2 php会话机制工作原理当浏览器向服务器发送URL请求,服务器会生成一个会话ID,并将浏览器端的一些信息保存在服务器端,然后将会话ID送到浏览器端保存到cookie里,当浏览器再次向服务器发送请求时会将cookie里的会话ID一并发送给服务器,服务器会将接收到的会话ID和服务器里的ID比较,如果相同服务器就认定是一次会话,会话的启动和终结 

 启动会话在服务器端进行,需要在php脚本的开始处进行session_start(),也可以在php.ini里进行配置session.auto_start=1,但是不推荐此种做法。销毁会话有两种方法,一种是在浏览器端,一种是在服务器端。在浏览器端销毁会话就是将浏览器端的会话ID信息清除,一般来说关闭浏览器后cookie里的信息会消失,当然不同的浏览器都会有默认的设置,可以手动修改也可以通过js来清除cookie信息。在服务器端销毁会话有两种方案,一种是调用unset(session变量)清除保存在服务器端的信息,当所有的session信息都清除后调用session_destroy()销毁会话ID。另外一种是通过设置session超时来实现的。

3、会话控制的跟踪方式有session 和 cookie

4、会话控制优势:跨页面传值,跟踪和识别用户信息

session定义:session存在服务器上用来跟踪和识别用户信息

使用session步骤 

1)开始一个会话

调用session_start()函数即可,函数的具体功能可以查阅PHP的文档。需要注意的是,必须在使用会话的脚本开始部分调用这个函数,如果没有,所有保存在该会话中的信息都无法在脚本中使用。除了手动调用session_start()函数外,也可以自动配置PHP自动调用,可以Google之。启动session :session_start();

2)注册一个会话变量

从PHP4.1以后,会话变量保存在超级全局数组$_SESSION中。要创建一会话变量,只需要在数组中设置一个元素,如$_SESSION['myvar'] = 5;session赋值:$_SESSION[‘键名’]=值;

3) 使用一个会话变量

要使用一个会话变量很简单,使用$_SESSION数组访问保存的会话变量即可,如 echo $_SESSION['mywar']; 会打印出 5。使用会话前必须首先使用session_start()函数启动一个会话。取值 $_SESSION[‘键名’];

4)注销变量和销毁会话

注销变量直接使用unset即可,如unset($_SESSION['myvar']),如何要一次销毁所有会话变量,可以使用 unset($_SESSION); 当使用完一个会话后,首先应该注销所有的变量,然后再调用session_destroy() 来清除会话ID。

A、unset():删除session里的某一个值 B 、全部删除session里的值: $_SESSION=array( ); C、彻底销毁session:session_destroy( );

session的工作原理

(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。

(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。

(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。

(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

回调函数的调用时机:open($save_path,$session_name):在运行session_start()时执行

close():在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行

read($id):在运行session_start()时执行,因为在session_start时,会去read当前session数据

write($id,$sess_data):此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行

destroy($id):在运行session_destroy()时执行

gc($maxlifetime):执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc

session_start():必须在session_set_save_handler后面执行

SESSION配置:

(1)session.save_handler=user

该选项定义用来存储和获取session数据的处理器的名字,默认值为files,也就是使用文件来存储session,在windows系统下,必须改变该选项才能使用session相关函数,如果使session入库,就得把files改为user,不过使用函数session_set_save_handler()可以在网页中改变这个配置

(2)session_save_path="/tmp"

定义了传递给处理器的参数,如果选择了默认的files文件处理器,则此值是创建的文件的路径,在Unix上默认的/tmp,在windows上,默认的是C:\windows\temp。使用函数session_save_path()可以改变这个配置 该指令还有一个可选的参数N来决定会话文件分布的目录深度。例如,设定为“5;c:\windows\temp”将使创建的会话文件和路径类似于c:\windows\temp\4\b\1\4\3\sess_4b143adadlsfjlsdkjfldsjfkf,要使用N参数,必须在使用前先创建好这些目录。注: 防止session文件过多 检索速度变慢 设置session多目录

(3)session.use_cookies=1

指定是否在客户端用cookie来存放会话ID,默认为1(表示启用)。

(4)session.name=PHPSESSID

指定会话名以用做cookie的名字,它只能由字母和数字组成,默认值为PHPSESSID。

(5)session.auto_start=0

指定会话模块是否在请求开始时自动启动一个会话,默认是0,表示不启动。 自动启动会话可以由维护由单个客户端发布的一组请求信息,每个网页请求都会启动创建会话,如果网页不依赖会话信息,那么就应该关闭自动启动,这样可以将少php应用程序服务器处理脚本的时间,从而提高效率。如果特定的网页需要提供会话支持,可以在网页内调用session_start()函数启动它。

(6)session.cookie_lifetime=0

以秒数指定发送到浏览器的cookie的生命周期,值为0表示”直到关闭浏览器“,即默认值。在网页中叶可以使用session_get_cookie_params()函数和session_set_cookie_params()函数读取或改变。

(7)session.gc_probability=1

该项和session.gc_divisor项配合使用,可以管理gc(garbage collection,垃圾回收)进程启动的概率,默认为1.

(8)session.gc_divisor=100

与session.gc_probability项配合起来使用,定义了在每个会话初始化时启动gc进程的概率。此概率使用session.gc_probability/session.gc_divisor计算获得,例如1/100意味着在每个请求中有1%的概率启动gc进程。session.gc_divisor默认为100.

(9)session.gc_maxlifetime=1440

指定过了多少秒后数据就会被视为“垃圾”,将会执行gc,从而被清除。关于这项配置有两个需要注意的点: 如果不同的脚本具有不同的session.gc_maxlifetime数值,但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清除数据。在这种情况下,可以与session.save_path一起使用本指令。 如果使用默认的基于文本的会话处理器,则文件系统必须保持跟踪访问时间(atime)。windows fat文件系统不行,因此如果必须使用fat文件系统或者不能跟踪atime的文件系统,那么就不得不想别的办法来处理会话数据的垃圾回收。自PHP 4.2.3起用mtime(修改时间)来代替了atime。因此对于不能跟踪atime的文件系统来说也没问题了。

0 0
原创粉丝点击