PHP中的会话控制 COOKIE
- httP特点:无连接无状态
- Cookie: 保存在客户端中的
内存cookie---有浏览器来维护,保存在内存中,浏览器关闭后就消失 ,存在时间是有限的
硬盘cookie()保存在硬盘中,有一个过期时间,也可以手动清除浏览器数据,否则营办cookie不会被删除,存在时间是长期的
Cookie使用场景一般在服务器端设置 可以用在永久登陆、购物车
操作cookie 设置、读取、更新、删除cookie
- 设置cookie setcookie()/setrawcookie()
bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = ""[, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )
$name设置cookie名称
$value 设置cookie值 默认为空
$expire 设置cookie过期时间 默认为0s
$path 设置cookie有效路径,默认为当前目录及其子目录,也可以指定为根目录及其子目录
$domin 设置cookie的作用域 默认为本域
$secure 设置cookie只能通过HTTPs传输 默认为false
$httponly 是否只是用http访问cookie 默认为false 如果设置为true,那么客户端就无法使用js操作cookie ,可以减少Xss攻击
- 读取Cookie
$_Cookie
- setrawcookie 用法和setcookie一样 但是不会对发送的值做urlencode编码 主要是针对加号和空格的编码
- 更新cookie 重新写一个setcookie 但是要保证修改前后的$path和$domian保持一致 否则会变为添加一个新cookie
- 删除cookie 只要让cookie过期就可以 但是和更新cookie一样需要保证$path和$domain 一致
- 通过header方法来设置cookie
Header(“Set-Cookie:name=value[;expires=date][;path=path][;domain=domain][;secure][;httponly]”)
Expires:gmdate(“D,d M Y H:i:s”,time()+3600);
Strtotime(‘+7 days’) 把字符转为UNIX时间戳
- 向cookie中存数组
Setcookie(‘userinfo[username]’,’111’,strtotime(‘+1 hour’));
Setcookie(‘userinfo[pwd]’,’222’.strtotime(‘+1 hour’));
- 通过js可以操作cookie
- Explode(‘字符’,’数组’)使用一个字符分割一个数组
Implode(‘字符’,数组)将一个一维数组转换为字符串
- json_encode()对变量进行 JSON 编码
Json_decode()对 JSON 格式的字符串进行解码
- cookie的缺陷:
- cookie是明文操作。不是很安全。
- 截取cookie可以用来cookie欺骗
- 不要把cookie当作客户端存储容器来操作,每个域名允许的cookie是有限制的,每个浏览器限制不同。Cookie最大字节数是4K
- Cookie设置后每次请求都会附着再http的头中,浪费带宽
- 可以用HTML5的localStorage本地存储来解决
- localStorage的基础用法
- localStorage.setItem($name,$value)//设置
- localStorage.getItme($name)//获取
- LocalStorage.removeImte($name)//移除
- LocalStorage.clear()//清除全部
PHP中的会话控制 session
- 什么是session:持续性的双向的连接
服务器和浏览器保有的共同的密码的时间
- 准备建立对话的时候PHP会先查看请求中是否包含session_id,如果没有服务器会在自己的内存里新建一个变量,这个变量就是session_id,列如session_1
- 服务器会把session_id发送到客户端浏览器保存,一般浏览器会把找个id存在cookie中
- 之后每次浏览器再去访问服务器是都会携带cookie中存储的session_id,这样这个服务器就认识这个浏览器了
- 服务器中的这个session_id变量就可以存放任何会话数据,这些数据是经过序列化处理后存放进去的
- 每次浏览器访问服务器都可以评价自己的session_id到服务器中认领自己的数据
- 如果想要销会话,可以删除会话中的数据,销毁会话文件
- PHP中如何使用session会话
- 开启session ---- session_start()
可以通过$_SESSION来设置相关值,设置和读取都是用这个全局变量
- 销毁session------session_destory()来销毁
- Session_name()获取session名称
Session_id()获取session_id
- 让session有生命周期
setcookie(session_name(),session_id(),time()+3600);
- session可以保存数组 直接把数组赋值给$_session
- Cookie禁用后session还能用嘛?答:可以,不过要用url方式传递session_name/session_id 然后用session_id($_GET[session_name])来绑定session名和id 就可以正常使用session了
- 彻底销毁session会话
- 将$_SESSION清空
$_SESSION=[]
- 将cookie中的数据清空 setcookie 让cookie过期就可以
If(ini_get(‘session.use_cookies’)){ //判断session是否使用cookie传递的
$params=Session_get_cookie_Params();//获取设置cookie另外选项的一些数组
Setcookie(session_name(),session_id(),time()-1.$params[‘path’].$parms[‘domain’],$params[‘secure’],$params[‘httponly’])
}
//获取的path为根目录下的会话路径
- 销毁session
session_destory()
/**
*销毁对话
*/
$_SESSION="";
session_destroy();
- 自定义形式存储session----自定义session管理器
最好存在redis内存管理器中
Ini_get()得到php ini配置中的某些数据
Ini_set() 修改php ini 配置中的某些数据
session_set_save_handler ( SessionHandlerInterface $sessionhandler
[, bool $register_shutdown
= true ] ) 设置自定义会话存储函数,可以将session信息存储到数据库中,但是这样需要在session之前加一台或者多台缓存服务器
使用自定义session管理器需要自己写完Session_set_save_handler 提供的接口,并且在使用前需要将ini配置中的session.save_handler设置为user--------ini_set(‘session.save_handler’,user)
require_once '实现的接口类';
$obj=new 自定义类;
ini_set('session.save_handler', 'user');
session_set_save_handler($obj,true);
session_start();
//下面写session操作