1.session原理
(1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
会话控制
1.什么是会话
web中的会话实际上是指浏览器和web服务器之间的会话,形象一点:就好比两个人进行一段对话。会话控制就是跟踪和识别用户信息的机制
2.php会话机制工作原理
当浏览器向服务器发送URL请求,服务器会生成一个会话ID,并将浏览器端的一些信息保存在服务器端,然后将会话ID送到浏览器端保存到cookie里,当浏览器再次向服务器发送请求时会将cookie里的会话ID一并发送给服务器,服务器会将接收到的会话ID和服务器里的ID比较,如果相同服务器就认定是一次会话,会话的启动和终结
3、会话控制的跟踪方式有session 和 cookie
4、会话控制优势:跨页面传值,跟踪和识别用户信息
使用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( );
回调函数的调用时机:
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()可以改变这个配置
(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的文件系统来说也没问题了。