一、Cookie
cookie是 在客户端保持用户数据
使用PHP代码函数操作cookie
1.1、添加和读取Cookie
setcookie & setrawcookie
两者用法一致
setcookie : 会对cookie的值进行url编码
setrawcookie: 不对cookie的值进行url编码
1.2、更新cookie
/**
* 通过JS操作cookie
*/
var Cookie={
set: function(key, value, expiresDays){//设置Cookie
//判断是否设置过期时间
if(expiresDays){
var date = new Date();
date.setTime(date.getTime()+expiresDays*24*3600* 1000);//格式化时间
//转换为cookie过期时间格式
var expires = "expires="+date.toGMTString()+";";
}else{
var expires = "";
}
//使用escape对value进行编码
document.cookie = key+'='+escape(value)+expires;
},
get: function(key){//获取Cookie
var cookies = document.cookie.replace(/[ ]/g, '');
var cookieArr = cookies.split(';');
var res;
for(var i=0;i
HTML5 提供了两种在客户端存储数据的新方法:
localStorage - 没有时间限制的数据存储,详细API介绍:https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
sessionStorage - 针对一个 session 的数据存储
4.1、localStorage API介绍
保存数据:localStorage.setItem(Key, value);
读取数据:localStorage.getItem(Key);
删除指定key数据:localStorage.removeItem(Key);
全部删除:localStorage.clear();
获取指定键名: localStorage.key(idx)
session是在服务器端保持用户会话数据的一种方法
5.1、session的存储同步
1.如果存储在memcached、redis或者MySQL中比较容易,
2.如果是文件形式的,你可以用NFS统一存储。
3.通过加密的cookie来实现
4.在负载均衡那一层保持会话,把访问者绑定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了,这些都是运维层面的东西。
5.2、禁用cookie的session使用方案
1.通过隐藏表单提交,
2.url传值:设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id,
A、use_trans_sid = 0,需要在链接中手动拼装sessionid,并在页面中读取链接中的sessionid设置到session_id中
链接:test.php?sessionid=xxxxxxxx,
test.php:
session_id($_GET('sessionid');
session_start();
var_dump($_SESSION);
B、use_trans_sid = 1,无需手动拼装链接,也无需手动设置session_id
3.用文件或数据库等形式保存session_id,在跨页过程中手动调用
以上的1和2其实使用的是同样的方法,只是途径不一样。
通过以上的分析我们不难看出,通过cookie传递sessionid,将session存储于memcache服务器中是为一个比较合理的选择。当出现跨域的情况是,可以使用p3p跨域设置cookie。而当客户端禁用cookie的情况下,可以设置php.ini,通过url自动传递session id。
5.3、session操作
//设置及获取回话cookie
session_set_cookie_params — 设置会话 cookie 参数
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
session_get_cookie_params — 获取会话 cookie 参数
array session_get_cookie_params ( void )
session_start();
$_SESSION=[];//将其数据清空
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();//获取会话 cookie 参数
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finally, destroy the session.
session_destroy();
如果不指定, Linux下默认在 "/tmp"目录。
线上在php.ini配置文件了做了指定,session内容存放在memcache缓存里。
默认session内容是存储在文件里的,即session.save_handler = files
下面是设置将session内容保存到redis里
线上环境下的配置:
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files
session.save_handler = redis
session.save_path = "redis.test.com:11311,redis.test.com:11312"
5.5、session的存储方式也可以自动实现