清除session时的一个小bug

编    写:袁    亮
时    间:2014-09-23
说    明:清除session时的一个小bug

1、清除所有session,不能使用unset($_SESSION);
单个session可以通过unset来删除,比如unset($_SESSION['GOODS']);
session的过程是在php执行session_start的时候,先查看cookie中是否有相应的sessionid
如果有,则将对应session名中的值,取出来,反序列化,变成一个php全局变量$_SESSION
执行过程中,session变量可以随意改变
脚本结束后,将session变量序列化,然后回写到对应sessionid中(这个时候,如果没有相应全局变量应该不会回写,从而导致该问题)

2、session常见优化:
开启session之后,访问量稍微大点,web服务器的IO压力就会急剧上升,因为默认是通过文件形式来做session的读写
一个简单的优化办法就是将session的存储方式改成Memcache形式,将php.ini中所有的session设置去除,加一下三行即可
[Session]
session.save_handler = memcache
session.save_path=tcp://192.168.0.106:11216

session相关知识总结文档

编    写:袁    亮
时    间:2015-01-15
说    明:session相关知识总结文档

一、说明
1、session是存储当前用户的一些信息
2、数据存储在服务器的文件中
3、session管理一个客户端(用户),一般通过cookie的形式
4、session可以让一个用户的数据在不同的页面之间互通

二、生存周期
1、服务端通过session_start开启session功能
前面不能有输出(因为这一步需要设置一个http头,设置cookie用)
2、初始化数据信息
判断之前有没有session的对应cookie(默认叫PHPSESSID)
如果有,则找到对应的文件,将文件内容读取,反序列化成php数组$_SESSION
如果没有,则$_SESSION为空
3、在脚本中,添加、删除、更改session数组的内容,即时生效
4、脚本运行结束,php进程将$_SESSION数组的内容,序列化,并重新写入到服务器对应文件中
如果整个$_SESSION被unset注销掉,会导致php进程跳过该操作,从而使得修改过的session没有保存,从而出错
5、session过期
PHPSESSID是一个会话形式的cookie,在浏览器关闭的时候就失效,从而使得session文件不再由对应的客户端用户
服务端会定时对session文件进行销毁,一般是24分钟(默认值1440秒)
session销毁是以概率形式的,这个概率在php配置中设置

三、SESSION存储方式
1、默认是使用cookie来和客户端进行对应关系,但也设置通过get形式来传递(不建议)
2、从上述周期看,每一次使用session都会涉及到文件的读写,在QPS较高的情况下,IO影响很大
可以在php中配置,使用memcache作为session存储的载体,从而把io降下来
[Session]
session.save_handler = memcache
session.save_path=tcp://192.168.0.106:11216
也可以自己写程序将session的所有操作重写,不建议这么干
3、cookie只能存储字符串,session可以存储object,数组等更复杂的数据
4、cookie的长度受限制,各浏览器不一样,session基本没有,但不建议存储太大的数据进去

四、php操作session
1、开启session
session_start();
如果前面有输出,会报错,可以通过ob系列函数解决该问题
2、session增、改,正常全局变量使用
$_SESSION['test'] = 'add';
$_SESSION['test'] = 'edit';
3、session删除
unset($_SESSION['test']);
session_destroy();清除所有session
不要unset($_SESSION);

cookie相关知识点总结

编    写:袁    亮
时    间:2015-01-15
说    明:cookie相关知识点总结

一、说明
1、http协议是无状态的,每一次请求之间互相独立,为了区分不同的客户端、用户,采用cookie进行标识
2、cookie内容保存在本地txt文件中,类似如下(火狐的):
.ci123.com    TRUE    /flashsale/sadmin    FALSE    1451097200    vip_plat    test3
作用域名        httponly 作用路径            https    过期时间     cookie名     cookie值

二、生存周期
1、服务端设置一个cookie,在http响应头里,会有一个头信息叫set-cookie的
在header头输出之前,不能有任何输出,因此setcookie之前也不能有任何输出
2、浏览器收到该头信息,会写入到客户端的cookie文件中
3、下次发起请求时,会将符合条件的cookie,从本地文件夹中将cookie字符串读取,拼接到http请求头里
只会发送未到过期时间的cookie
该时间以客户端机器为准(因此有时候会出现cookie设置不起来,因为用户电脑的时间不对,导致设置的cookie一直都是已经过期了的)
4、服务器接到http头信息里的cookie数据,将其格式化成相应的cookie数组
同名的cookie只有第一个有效,后面无用(顺序由浏览器根据相应策略决定)

结论:当前页面设置了cookie,本页面是取不到该cookie的,明白了上述流程自然清楚

三、php使用
1、设置cookie:
setcookie(name,value,expire,path,domain,secure,httponly);
2、删除cookie:(跟设置的时候保持一直,只将值设为空即可)
setcookie(name,'',expire,path,domain,secure,httponly);
3、获取cookie:
$val = $_GET['name'];

name:cookie的名称
value:cookie的值(没有值的时候,则注销该cookie)
expire:过期时间,unix时间戳(默认是0,会话,浏览器关闭则失效)
path:在域名的哪个目录下起效
默认只在设置的那个网址目录以及其子目录下有效
比如local.ci123.com/bbs/sub/post_add_sub.php中设置的一个cookie,默认只在/bbs/sub/以及其子目录下有效
domain:在哪个域下有效(只有域名的右前缀值有效,不是随便设置的
test.shop.ci123.com只能设置test.shop.ci123.com,shop.ci123.com,.ci123.com这三个值,默认是test.shop.ci123.com
secure:是否只能通过https发送(很少用,一般都是false)
httponly:js是否可以读取该cookie,一般不允许(设为true)

四、同名cookie
1、cookie名称并不能唯一的标识一个cookie,由三个东西唯一确定:cookie名+作用域(domain)+作用路径(path)
2、cookie名相同的情况下,浏览器会根据一定策略,重新排列cookie字符串,并发送给服务器,服务器只认第一个
1、作用路径顺序(在域名判断之前)
shop.ci123.com/flashsale/访问的时候有两个同名cookie,分别在以下作用路径,则/flashsale/有效
/flashsale
/
2、域名顺序
shop.ci123.com访问的时候有两个同名cookie,分别在以下作用域名,则shop.ci123.com有效
shop.ci123.com
ci123.com

五、工具
firefox的新版firebug插件就集成了cookie插件
chrome也有直接查看cookie的(网址左边的图标)

六、session与cookie的关系
session存储在服务端
一般是通过cookie来标识(不改默认配置的话,是叫PHPSESSID)