会话技术-------session技术
使用session将会话数据存储于服务器端,同时使用会话技术可以区分浏览器;
为每个会话数据建立独立的会话数据区(来存储当前会话的全部数据);每一个会话数据区存在唯一的标志;同时浏览器端用cookie存储该唯一的标志sessionID;做配对使用;sessionID存储于cookie中;sessionID在cookie中就是一个普通变量;
服务器响应的时候,就会自动设置sessionID到cookie中;
在服务器响应的时候设置sessionid到cookie中;
开启session机制:session_start();
在开启session_start()之前,$_SESSION是不能使用的;
增删改查(下面几句话);每一个脚本周期内如果要使用session;必须先开启session.
设定:
判断:
session的属性:
--------有效期:默认会话周期结束(浏览器关闭);如果session失效,下次请求时,cookie就不会携带sessionID,所以服务器端就获取不到session数据区的数据,但是session数据区的数据还是存在服务器临时目录中(成了废弃的数据),至于什么时候销毁session数据区的数据,要看session的垃圾回收机制;如果cookie没有携带SESSIONID,就会新建一条SESSSIONID,又建立一个session数据区;
-------------有效路径:默认整站有效;(cookie是默认当前目录和后代目录);
-----------有效域:默认当前域有效;
-----------是否仅安全连接:默认false;
-----------是否仅为http或https使用httonly:默认false;
session的属性取决于存储于浏览器端的sessionID的cookie变量;
如果需要更改session数据的属性,其实是更改存储在浏览器端的seessionID的属性;
在php。ini中设置;
更改session属性:
session的键(SESSIONID)和值是特定的,不需要添加到设置中,所以有五个参数;
session——set_cookie_params(有效期(是时间间隔,cookie用的是时间戳,要注意),有效路径,有效域,是否仅安全传输,是否httponly);要在session_start()前设置完毕;
cookie是针对单个会话数据做设置;session是针对所有的session数据做的设置;
如果对session的属性做修改,会对服务器造成压力(session是存储在服务器端的);项目中一般不对session的属性做修改;如果需要对数据做长时间的保存,则用cookie;
session可以存储任意数据类型(不包含资源),资源不能序列化,资源是php外部的;cookie只能是字符串的数据类型;
session数据区内的数据是序列化后才存储的;
$_SESSION数组的下标只能是字符串类型;
session_start()类似于header();前面不能有输出(PHP标签外的都算输出,echo,var_dump等);
脚本周期和会话周期不是同一个概念:脚本周期是程序关闭,会话周期是浏览器关闭;
session 数据区(是一个文件)的操作:
自动的在会话周期(浏览器关闭)结束前($_SESSION 销毁前),吧session数据存到session数据区;在脚本周期内是用$_SESSION这个变量来管理session数据。
在一个脚本周期内,只对session数据区读一次(开启session的时候),写一次(基本周期结束的时候写);
虽然session数据区销毁了,但是在脚本周期内$_SESSION中还有数据,但是脚本周期结束后,就不会自动写入session数据区了(原因是关闭了session机制);因此下次脚本周期就不能获取session数据了;
ini中的 session .name变了,PHPSESSID就变了;
注意:
参数的顺序是固定的;要在session开启前设置;
重写的session机制,改变了原来默认的实现,现在都需要在自己定义的函数中做读写操作;
读操作----在session开启的时候被调用;从当前的session数据区读取内容;
创建数据库表存储session数据;
读操作:
删除操作:
调用了session_destroy()销毁 session过程中被调用,才会执行delete;
===如何识别垃圾数据区
垃圾回收机制“:
如何识别垃圾数据:
加上最后处理时间的字段:
在写操作的时候,带时间戳存储:
”
开启了垃圾回收机制,可能执行垃圾回收,也可能不执行垃圾回收,是有概率的,可以配置;
这是可能执行的次数;
这是基数;
只要开启了session机制,设置了垃圾回收机制概率:就有可能执行垃圾回收机制;从而你就会调用自定义的垃圾回收函数;
可能session数据区过期了,但是还是能读取到数据,那是因为过期的session数据区还没被删掉;
session数据区过期和sessionID过期不一样(sessionID过期就是cookie过期了);
如果重写session机制,要保证session机制不自动开启(配置文件中设置不开启);应为session_set_save_handle()要在session机制开启前设置;
如果不对session的存储做处理,session默认是以文件的形式存储的;重写session存储机制时,将其改为user(建议);
项目中的session如数据库:
注意上面的session_set_save_handler()方法中的参数,如果参数是函数时,必须要用数组的形式,其中$this 是指哪个对象的方法,如果静态方法,则需要用类名,如上,数组中的元素位置必须固定;如果参数是方法名时,可以直接写。
cookie和session的区别:
session数据持久化:SESSIONID和服务器端的session数据区;
cookie禁用了,session就不能用了。但是技术上可以实现cookie禁用,session可用get和post来实现(实际中都不会这样做);
session.use_oonly_cookie=1;-----默认情况下只用cookie来传输SESSIONID;0 表示不仅仅使用cookie传输;
是否自动采用其他方法传输sessionID:0表示不采用其他方式(cookie之外的方式);1表示可以使用其他方式传输SESSIONID;
默认session的存储路径是操作系统下的tmp临时目录;
配置文件:
在application目录下创建一个config目录;用来配置项目应用程序;
配置文件的内容格式:
一般在框架类中初始化载入配置文件;
static是针对同一个类中所有方法公用;超全局$GLOABALS是针对整个项目,整个项目中都可以使用;