session和cookie

2016-09-22  本文已影响55人  全栈coder

session和cookie都是会话控制思想的体现,即:允许服务器跟踪同一客户端的连续请求。


cookie是什么?

将使用者的资料记录存放在客户端的技术

cookie运行原理?

首先:服务器 通过http的响应头 把用户的信息 以键值对的形式发送到客户端

然后:当客户端再次访问同一台服务器其他的脚本时,会自动携带cookie中的信息通过http请求头传送给服务器

最后:服务器接收到信息,重新对登陆者身份进行验证

cookie包含了什么?

cookie包括名字,值,域,路径,过期时间。

路径和域构成cookie的作用范围。cookie如果不设置过期时间,则这个cookie在浏览器进程 存在时有效,关闭时销毁。如果设置了过期时间,则cookie存储在本地硬盘上,在各浏览器进程间可以共享。

怎么设置cookie?

使用php内建的setcookie()函数

setcookie($name,$value,$path,$domain,$source)一共六个参数,一般常用前三个 名字,值和生存时间。最后一个source指的是是否仅在安全的https连接时传送,默认false

例:setcookie(‘name’,‘tian’,time()+60*60*24*7,'/test','.baidu.com',‘1’)设置cookie名为name,值为tian,这个cookie七天后失效,只在服务器test目录下生效,只在baidu.com的所有子域中生效,仅在安全的连接中才能被设置

注意:setcookie的第二个参数只能是字符串或者数值

怎么删除cookie?

第一种方法:setcookie('name')  省略了别的参数

第二种方法:setcookie(‘name’,'',time()-1)  把生存时间设为过期

cookie放哪了?

如果用户是windows系统,那么放在了C:\Docunments and Settings\用户名\Cookies

cookie的形态?

cookie可以是单一的,通过setcookie('name','tian') 现在cookie的标识符为name

cookie也可以为数组,通过setcookie('user[username]','tian') 现在cookie的标识符为user[username],这是一个数组的下标


seesion是什么?

将使用者的资料记录存放在服务器端的技术

session是保存使用者的资料在服务器系统下,而cookie是将数据放在客户端的计算机之中对于session来说,客户端仅仅保存服务器为用户创建的一个session标识符称为sessionID而在服务器端保存session变量的值。sessionID是一个32位的字符串,一般情况下sessionID保存在客户端的cookie里。如果禁用cookie,sessionID可以通过隐藏表单传递,也可以通过URL重写,就是把后缀到url传递

session运行原理?

首先:第一次访问网站,session_start()函数创建一个sessionID,通过HTTP响应头发送到客户端并保存在cookie中,同时也在服务器端创建一个以sessionID命名的文件,保存用户的会话信息

然后:用户再次访问网站时,先检查HTTP请求头中是否有一个sessionID,没有就创建同上一步,有的话就在服务器硬盘中搜索与seesionID同名的文件,将会话信息读出。

session的使用

在php中必须先调用session_start()函数,开启session。函数没有参数,如果是基于cookie的session,使用该函数之前,不能有任何内容的输出。

启动完成后,接下来就是注册和读取session变量,都要用过全局数组$_SESSION数组完成session_start();然后注册session变量$_SESSION['username'] = "tian";

注意:在$_SESSION['username'] = "tian"赋值的同时也会在sessionID文件中追加信息;当用户再次请求本页或其他页面,或者 echo $_SESSION['username'] ,是先从这个用户的seesionID文件中获取全部的信息数据进入到$_SESSION数组中,感觉起来好像是直接从数组中获取得值。

注销变量与销毁Session

1.session_destroy()结束当前的会话,清空会话中所有资源,但不会释放session相关变量

2.  unset($_SESSION['username']);             //删除session中注册的用户名变量 unset($_SESSION['password']);                     //删除删除session中注册的密码变量或者直接$_SESSION = array()    将这个全局数组赋为空

3.setcookie(session_name(),'',time()-3600,'/');    //删除客户端的cookie,这个第一个参数session_name是php.ini里设置的sessionID的cookie标识符

Session的自动回收机制

虽然用户可以点击“退出”按钮退出登录,但如果直接关闭浏览器或者断电的情况下载服务器端保存的Session文件是不会被删除的,虽然下次登录会重新分配一个sessionID,但是之前的Session文件已经成为了垃圾文件。

在php.ini中使用session.gc_maxlifetime选项指定一个时间,例如1440也就是24分钟后没有更新修改时间的session文件就会被‘垃圾回收程序’收回。

垃圾回收程序是在session_start()函数调用时启动的,如果用户很多,可能一秒内session_start()函数会调用N次,每次都要垃圾回收的话是不合理的。

可以在php.ini中修改session.gc_probability/session.gc_divisor公式计算概率例如1/100,前者设为1,后者设为100。

自定义Session处理方式

session默认在web服务器中存储会话信息,但是如果用户量特别大的情况下,文件I/0开销会很大,严重影响效率,最主要的是不能跨服务器, 对于大系统一般都会使用多台服务器进行并发处理,这样就不能达到跟踪用户的目的。 ——需要我们改变session存储方式:

1.使用NFS或者SAMBA共享技术保存在其他服务器中。 2.使用数据库保存session信息。    3.(最优)使用memcache缓存技术存储。

不论使用哪种方式原理都是一样的,使用php中的session_set_save_handler()函数处理:该函数六个必选参数,分别代表了session声明周期的六个过程

上一篇下一篇

猜你喜欢

热点阅读