Session 原理总结

一、session是怎么保存的?怎么去查看其内容?

session是以文件的形式保存的。php.ini中有个配置项--session.save_path= "";这个里面填写的路径,将会使session文件保存在该路径下。session文件的命名格式是:"sess_[PHPSESSID的值]"。每一个文件,里面保存了一个会话的数据。其实只要使用代码$_SESSION['user_id'] = $value;就会促发php的session机制,结果往对应的session文件中写入一个值。

二、session.save_path路径下这么多的session文件,php是如何确定要调用哪个session文件的?

php是依据,一个名为PHPSESSIDcookie,根据它的值,确定要调用哪个session文件的。去浏览器中,可以看到一个cookie名为PHPSESSID,假如它的值为"sess_adbjsf2q1ass26oootd163sf84",那么,当访问服务器的时候,就会调用session目录下名为"sess_adbjsf2q1ass26oootd163sf84"的文件。其实,PHPSESSID就是一个会话id,以此来确定,哪个是你的会话数据。

download.png

cookie的名字PHPSESSID是可以改的,在php.ini中 session.name = PHPSESSID就是设置该cookie的名字。

要说session跟cookie有关联的地方,就是跟PHPSESSID这个cookie有绑定关系。其他,不管你设置什么cookie,使用session的时候是不会用到这些值的。也无法获取到。比如同步登陆,设置即使设置了cookie,而你的应用是依据session判断是否为登陆状态的(事实上也必须如此,因为session保存在服务器端,安全性更高,哪个依据cookie认为你已经登陆,那么很惨

三、经常遇到的现象:为什么删除一个session文件,之后生成一个session文件,新的文件名字还是与原来一样?

理解到session文件的命名规则是:“sess_PHPSESSID值“。那么,就很容易明白了。因为,客户端存在cookie:PHPSESSID。客户端发送请求后,会将该cookie发送给服务器(php可以使用$_COOKIE['PHPSESSID']看到其内容),这样的话,还是会根据PHPSESSID生成一个session文件的。

四、如何查看session文件中的session值?

我在开发中发现,如果仅仅依靠session_start()$_SESSION['user_id']这样的代码,去调试,还不够全面的了解问题所在。

比如,我想知道,session_start()到底在完成哪些操作?如果,想动态,实时知道session的值是如何被改写的,打开一个session文件,查看是很了然的。

原来,里面就是保存的是一些被序列化后的值。也明白一个知识点,"php圣经"中讲解session的时候,提到session值做被序列化了。下面看到的session内容就是被序列化了。

打开一个session文件,内容如下:

cityID|i:0;cityName|s:3:"all";fanwe_lang|s:5:"zh-cn";fanwe_currency|a:4:{s:2:"id";s:1:"1";s:6:"name_1";s:9:"人民币";s:4:"unit";s:3:"¥";s:5:"radio";s:6:"1.0000";}_fanwe_hash__|s:32:"77c18770c6cb5d89444c407aaa3e8477";

总结出读取规则:

  • 1、每一个session的值是以分号";"分开的。

    • 比如cityID|i:0;cityName|s:3:"all";就是一个完整的session值结束
  • 2、里面的读取规则:符号“|”前面表示session名称。符号后面是该session的具体信息。包括:数据类型,字符长度,内容。

    • 上面第一个就相当于使用如下php代码访问:$_SESSION['cityID']
  • 后面的s表示数据值的长度,3表示字符长度。比如这一段:fanwe_lang|s:5:"zh-cn"; fanwe_lang是变量的名称,变量值是"zh-cn",长度刚好是5,就是”s:5“标明的。

  • 最后"all"就表示session的具体值了。就是使用代码$_SESSION['cityID']后会得到的结果。

  • 3.一个session可以保存一个数组。符号{}表示数组的内容。上面的花括号{}是$_SESSION['fanwe_currency']所保存的内容。要想查看id的值,就使用代码:$_SESSION['fanwe_currency']['id']

五、怎么样理解session_start等函数所做的实际操作是什么?

我是这样理解的:session_start,可以看成是创建一个session文件。假如有原来的session文件,或许没有创建。引入一个。往session文件中写值,那是代码$_SESSION['']=" "; 赋值所完成的操作。

session_start()生成一个新的session文件名时。会判断是否存在cookie名为PHPSESSID的值。如果存在,那么就会按照它的值,组合成一个文件名"sess_[phpcookie值]"。所以,在目录下,老是能够看到之前删除过的session文件名。如果将浏览器中对应的cookie(PHPSESSID)删掉。那么就不会生成同样的名字了。如果不存在名为PHPSESSID的cookie。php所做的估计为:先发送一个cookie,然后按照cookie的值生成一个(我可以在浏览器中马上看到一个名为PHPSESSID的cookie)

其实,现在也更加深刻地理解了一个知识:在调用session_start()之前不能有任何输出。有输出就会报错。

session_start()已经封装了发送cookie的操作(发送一个名称为PHPSESSID的cookie到浏览器)。涉及到http的一个原理:头部信息必须在内容之前发送才行。所以,使用echo '内容';

header('Content-type: text/xml; charset=gb2312');//头部信息,不算内容

可以这样认为:session_start()内部已经进行了一次发送头部动作。所以之前不能有任何输出内容。
手册中的英文大致是这样说的:创建一个session,或者恢复当前一个session(基于request请求传递的session id,这里应该值的就是http请求时传递的名为PHPSESSID的cookie)

六, 实际开发应用总结:
  • 只要是同一个用户的操作。导航程序访问记录和团购程序访问的记录都是保存在同一个session文件中
  • 如果是不同的域呢?假如用户访问cs.test.comdaohang.test.com,两方程序都设置了session。那么session的结果保存在同一个session文件中吗?
  • 因为:服务器是统一管理session文件的存放的。而php引擎是根据phpsessionid的值确定要操作哪个session文件。session
  • 文件名的格式是:"sess_[phpcookie值]"。依次寻找对应的session文件(于是在浏览器查看名为PHPSESSIONID的cookie,过期时间是在会话结束后)
    所以,只要cs.test.com和daohang.test.com使用的是同一台服务器。
    这样的话,假如是多台服务器的情况。那么就不得不将session保存在数据库中去。这样实现session共享。跟具体的服务器是无关的。

session文件是某个用户整个会话过程中数据。那么,假如cs.test.com和daohang.test.com下的两个程序运行在同一个服务器上。就意味着,访问cs.test.com与访问daohang.test.com是同一个会话。也就意味着,这两边访问后设置的session数据是保存在同一个session文件中的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容