一、Cookie
cookie是 在客户端保持用户数据
使用PHP代码函数操作cookie
1.1、添加和读取Cookie
setcookie & setrawcookie
两者用法一致
setcookie : 会对cookie的值进行url编码
setrawcookie: 不对cookie的值进行url编码
<?php
/**
* 读取Cookie
* @param $param
*/
function read($param){
//读取Cookie
print_r($param);
}
//内存存储Cookie
setcookie('username1','lvfk');
//设置过期时间
setcookie('username2','lvfk', time()+30);//10秒后过期
//设置有效路径
setcookie('username3','lvfk', time()+60);//默认当前路径
//设置有效路径,表示同目录及其子目录有效,在上层目录无效,
//同目录及子目录有效:/var/www/,/var/www/a,/var/www/b
//上层目录无效:/var/,或者/var/bb/
setcookie('username4','lvfk', time()+60,'/var/www/');//设置路径
//整个根目录有效
//此时对/var/,/var/bb/,/var/www/,/var/www/a,/var/www/b 等均有效
setcookie('username5','lvfk', time()+60,'/');//根路径
//设置Domain,设置Cookie的作用域,默认在本域下面
//setcookie('username6','lvfk', time()+60,'/','.test.com');
setcookie('username6','lvfk', time()+60,'/','10.168.1.216');
//设置Cookie是否只能通过HTTPs传输,默认为False
setcookie('username7','lvfk', time()+60,'/','10.168.1.216',false);
setcookie('username8','lvfk', time()+60,'/','10.168.1.216',true);
//是否只使用HTTP方案Cookie,默认为False,设置为True时JS无法访问Cookie,可减少XSS攻击
setcookie('username9','lvfk', time()+60,'/','10.168.1.216',false,false);
read($_COOKIE);
1.2、更新cookie
<?php
/**
* 更新Cookie
* @param $param
*/
//设置过期时间
//setcookie('username','lvfk', time()+3600);//1小时后过期
//修改cookie(只要对同一个cookie key 操作)
setcookie('username','lvfk123', time()+3600);
1.3、删除cookie
<?php
/**
* 删除Cookie:原理为对cookie设置过期即可
* @param $param
*/
//设置过期时间
//setcookie('username','lvfk', time()+3600);//1小时后过期
//删除cookie(只要对cookie设置过期即可)
setcookie('username','lvfk123', time()-1);
二、使用header函数的方式操作cookie
<?php
/**
* 通过Header函数操作cookie
* @param $param
*/
//设置内存cookie
header("Set-Cookie: username=yy;");
//设置cookie的过期时间
//先来看看gmdate函数使用方法
//header('Date: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
//header('Last-Modified: '.gmdate('D, d M Y H:i:s \G\M\T', time()));
//header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));
//or if you prefer double quotes and don't want to bother with double backslashes:
//header("Date: ".gmdate("D, d M Y H:i:s", time())." GMT");
//header("Last-Modified: ".gmdate("D, d M Y H:i:s", time())." GMT");;
//header("Expires: ".gmdate("D, d M Y H:i:s", time() + 3600)." GMT");
//设置1小时过期
header("Set-Cookie: a=xx;expires=" .gmdate('D, d M Y H:i:s \G\M\T', time() + 3600));
//设置Domain
header("Set-Cookie: b=xx;expires=" .gmdate('D, d M Y H:i:s \G\M\T', time() + 3600).";domain=10.168.1.216;");
//设置path
header("Set-Cookie: e=fe; path=/;");
header("Set-Cookie: ee=fw; path=/;");
//设置安全
header("Set-Cookie: ad=dd; secure");
/**
* 通过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<cookieArr.length;i++){
var arr = cookieArr[i].split('=');
if(key = arr[0]){
res = arr[1];
break;
}
}
return unescape(res);
}
};
四、HTML5技术
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
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
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();
5.4、session的存储方式
如果不指定, 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的存储方式也可以自动实现
<?php
/**
* 只要通过OOP的方式实现接口SessionHandlerInterface,那么就可以替换系统的session文件存储方式
* 以下是把session存储到数据库,代码省略...
*/
class SessionUserHander implements SessionHandlerInterface{
/* Methods */
public function close (){
}
public function destroy ( $session_id ){
}
public function gc ( $maxlifetime ){
}
public function open ( $save_path , $session_name ){
}
public function read ( $session_id ){
}
public function write ( $session_id , $session_data ){
}
}
//设置为session存储类型为自定义user
ini_set('session.save_handler','user');
//设置到session存储的handler,替换默认的文静存储方式
session_set_save_handler(new SessionUserHander(),true);//php 5.4之后,设置第二个参数为true