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声明周期的六个过程