php cookie和session的代码操作

一、Cookie

cookie是 在客户端保持用户数据

使用PHP代码函数操作cookie

1.1、添加和读取Cookie

setcookie & setrawcookie

两者用法一致

setcookie : 会对cookie的值进行url编码

setrawcookie: 不对cookie的值进行url编码


1.2、更新cookie


1.3、删除cookie


二、使用header函数的方式操作cookie


三、通过JS操作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技术

HTML5 提供了两种在客户端存储数据的新方法:


localStorage - 没有时间限制的数据存储,详细API介绍:https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
sessionStorage - 针对一个 session 的数据存储


php cookie和session的代码操作_第1张图片


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的存储方式也可以自动实现

Warning

在脚本执行完毕之后,PHP 内部会清除对象, 所以有可能不调用 write 和 close 回调函数。 这样可能会引发非预期的行为,所以当使用对象作为会话保存管理器时, 需要通过注册 shutdown 回调函数来规避风险。 通常,你可以通过调用 register_shutdown_function() 函数 来注册 'session_write_close' 回调函数。

在 PHP 5.4.0 中,可以调用 session_register_shutdown() 函数来注册 shutdown 回调函数。 如果你使用 session_set_save_handler() 的 OOP 原型, 那么仅需设置 “register shutdown” 为 TRUE 即可。



你可能感兴趣的:(session,cookie,localStorage,sessionStorage)