【转】php中的会话机制(2)
原文:https://segmentfault.com/a/1190000000468220
发现,在调用session_start()的时候, session_start() 里面应该是有调用类似 setcookie()函数往客户端写cookie 的。
----------------------------------------------------------------
session 会话机制:
1)如果是基于cookie的会话机制,在调用session_start()之前,是不能够有任何实际的输出的,即使是空格或者是空行!
因为session_start()函数调用的时候,其实是通过setCookie()函数向cookie中设置了
PHPSESSID这个key,对应的value是一个随机的、唯一的32位字符串! 而setCookie前面是不可以有任何实际的输出的!注意:这里的PHPSESSID名字是在php.ini文件中进行的配置!配置如下图所示:
2)这里我们需要明白session_start()函数的作用究竟是什么:
①如果session机制是基于cookie的,那么当脚本第一次运行的时候
A、 在客户端上session_start()函数会通过setCookie()函数向Cookie中保留一个key,默认情况下Key的名字是PHPSESSID,对应的值是一个32位的、唯一的、随机的字符串!
B、 在服务器端,会产生一个以PHPSESSID的value值为名字的文件!其中保留的是session中的数据!同时,在脚本中创建$_SESSION超全局数组,并将session文件的数据反序列化,添加到$_SESSION数组中!②当脚本第二次,及以后运行的时候
A、 浏览器端会自动携带COOKIE中的PHPSESSID对应的value值,将数据送至服务器端!
B、在服务器端,一旦开启sessioin_start()的时候,会根据客户端提供的sessionid去寻找对应的session文件,将session中的变量读取出来!在脚本中创建$_SESSION超全局数组,将数据定义到$_SESSION数组中!注意:$_SESION数组数组只有在调用session_start()函数之后,更确切确切的说,是开启session机制之后]才会存在!之所以这样说,是由于session_start()时,会先得到session_id,通过session_id找到对应的文件内容,然后进行反序列化!如果,我们接着使用session_id()函数来滞空session_id的话,我们就找不到session中的内容了!
同时,$_SESSION是超全局定义数组,他和常量一样,并没有作用域的概念!几乎在哪里都可以使用!
接下来,我们来看一点代码!当我们第一次运行这个脚本,脚本代码如下 脚本A中的代码:
<?php
session_start();
$_SESSION['name']='maweibin';
?>
在服务器端保存session文件夹中的的文件入下:
代码中的保值至如下:
在客户端保存了一个cookie文件,内容如下:
通过观察我们可以发现:PHPSESSIONID对应的value值和服务器端session文件的文件名是一致的!
当第二次及其以后运行这个脚本的时候,在服务器端,并没有什么变化
在客户端,发起http请求的时候,我们可以看到:
请求的时候会字段的将cookie中的PHPSESSID带到服务器端!服务器端,会通过提供的sessionid值,将session文件中的数据读取出来!
3)同cookie不同的是,session中的数据不仅可以存放字符串,还可以存放数组和对象!
<?php
session_start();
$name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省');
$_SESSION['voice'] = $name;
?>
<?php
session_start();
var_dump($_SESSION['voice']);
?>
运行的结果如下:
array(3) { ["name"]=> string(3) "jay" ["age"]=> string(2) "23" ["addr"]=> string(9) "吉林省" }
注意:这里我们有必要讨论一下,为什么cookie中不能存放数组之类的变量,而只能够存放字符串!我们来看几段代码:
<?php
session_start();
$name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省');
$_SESSION['voice'] = $name;
?>
在session文件中存储的数据如下:
name|s:8:"maweibin";voice|a:3:{s:4:"name";s:3:"jay";s:3:"age";s:2:"23";s:4:"addr";s:9:"吉林省";}
<?php
$expires = time()+3600;
$name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省');
setcookie('name',$name, $expires, '/talkphp/secondtalk/', 'php.test.com');
?>
此时,我们调用一下这段脚本:
<?php
$name = $_COOKIE['name'];
var_dump($name);
得到的结果是null,由此可见这样的写法是不支持的!
?>
我们再看一段代码:
<?php
$expires = time()+3600;
setcookie('person["name"]','liangbo' , $expires, '/talkphp/secondtalk/', 'php.test.com');
setcookie('person["age"]','23' , $expires, '/talkphp/secondtalk/','php.test.com');
?>
运行结果如下:
array(2) { [""name""]=> string(7) "liangbo" [""age""]=> string(2) "23" }
虽然也取到了数据,但是,cookie中的数据却和session中的数据并不相同!但是,我们来看一下cookie文件中存储的数据
person["name"]
liangbo
php.test.com/talkphp/secondtalk/
0
976582400
30365600
3634030379
30365591
person["age"]
23
php.test.com/talkphp/secondtalk/
0
976582400
30365600
3634060380
30365591
由此可见,cookie之所以不能够保存数组或者是对象等变量,是因为cookie本身并没有序列化,和反序列化这一步!这也提示我们,如果,我们手动将将变量进行了序列化和反序列化,就可以用cookie来存储变量了!
4)删除session数组需要注意的地方:
我们可以使用unset()方法干掉$_SESSION[‘key’] ,这样可以单独的干掉一个值,此时$_SESSION数组依然存在!
但是,如果我们需要清空session中的全部数据的时候,是不能够直接unset($_SESSION)。这样在当前脚本周期之内,超全局定义数组$_SESSION 就不存在了!我们也就没有办法操作session中的数据了!
我们来看一段代码:
<?php
var_dump($_SESSION);
session_start();
var_dump($_SESSION);
unset($_SESSION);
session_start();
var_dump($_SESSION);
?>
运行如下:
NULL array(0) { } NULL
从上面的代码中,我们至少可以得出两个结论:
① 开启session机制前,$_SESSION数组是不存在的!
② $_SESSION 数组在脚本周期内,一旦被干掉,就不会再产生!即使重新开始session机制之后,该数组也并没有出现!
因此,我们想要清空$_SESSION 中的数据的话,就需要使用$_SESSION = array()的形式,这样能够在脚本周期之内,保证$_SESSION数组的存在!
5)cookie中的值保存改变的问题!
有的时候,我们需要对cookie中的值进行重写!如果,后面并没有跟路径名、域名、过期时间的话,简单的进行重写就可以了!
但是,如果cookie中保存了这些参数,而我们重新设定值的时候,并没有设置相关参数,这些参数还会被完整保留下来么?还是没有了?看代码:
<?php
//文件路径: /talkphp.php
$expires = time()+3600;
setcookie('name','liangbo' , $expires);
运行结果如下图
?>
<?php
//文件路径: /secondtalk/se
setcookie('name','maweibin');
?>
<?php
$name = $_COOKIE['name'];
echo $name;
?>
从上面的代码中,我们可以得出以下结论:
①原有cookie中保存的值,是否被后来的cookie值是否被覆盖取决于,两个参数:
(1)path路径
如果在同一个域名,但是不同的路径下,设置了同名的cookie,那么该域名下回保存两个cookie,依据路径的不同,选择使用哪一个cookie(因为cookie中的key相同,那么只能依靠path路径进行区分!)
(2)domain域名。很明显,不同域名下的cookie肯定是两个,同名的话,也不冲突
②如果在同一个域名、同一个路径下,设置了同名的cookie,那么后面的cookie值会覆盖前面的值!
path路径、过期时间、所在域名都以最后一个cookie的为准!如果,该cookie并没有设置这些参数,那么cookie会话机制,会进行自动的填充!
path路径,以当前的运行脚本路径为准! 过期时间,就是一个会话周期,浏览器关闭后,就消失! domain域名,就是url中的域名!
6)cookie携带的问题
经过试验证明,凡是从浏览器端发起的请求,在访问同一个域名的时候,cookie是会被自动携带到服务器端的,无论是通过url访问、还是通过ajax调用访问cookie都是会被自动携带的!
注意:只有是从客户端发起的请求,cookie才会被自动携带!
【转】php中的会话机制(2)的更多相关文章
- WCF初探-26:WCF中的会话
理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...
- JavaWeb中Cookie会话管理,理解Http无状态处理机制
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...
- JavaWeb中Session会话管理,理解Http无状态处理机制
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512955067434271246/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...
- 重温WCF之WCF中可靠性会话(十四)
1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序.当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性.然而 ...
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- note.js之 Mongodb在Nodejs上的配置及session会话机制的实现
上篇我们使用nodejs实现了一个express4的网站构建配置,但一个有面的网站怎么可以缺少一个数据库呢.现在较为流行的就是使用MONGODB来作为nodejs网站引用的数据库,可能它与nodejs ...
- Servlet基础知识(三)—— 会话机制Session,Session和Cookie的异同
Servlet会话机制: Http是一种无状态协议,它是无记忆的.也就是说,服务器不会保存用户的任何信息,当同一用户再次去访问时,服务器是不认识你的,它还是会建立新的连接. 但有时候我们需要服务器保留 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- Cookie&Seesion会话 共享数据 工作流程 持久化 Servlet三个作用域 会话机制
Day37 Cookie&Seesion会话 1.1.1 什么是cookie 当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中.这样,当该浏览器 ...
随机推荐
- 微软企业库5.0 学习之路——第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息
在介绍完企业库几个常用模块后,我今天要对企业库的配置文件进行处理,缘由是我打开web.config想进行一些配置的时候发现web.config已经变的异常的臃肿(大量的企业库配置信息充斥其中),所以决 ...
- 最短路-Bellmanford
简介: 给定一个图和一个源点,求源点到其余点的最短路径,图中有可能存在负权边. 算法步骤 1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0; 2.迭代 ...
- HDU 5127.Dogs' Candies-STL(vector)神奇的题,set过不了 (2014ACM/ICPC亚洲区广州站-重现赛(感谢华工和北大))
周六周末组队训练赛. Dogs' Candies Time Limit: 30000/30000 MS (Java/Others) Memory Limit: 512000/512000 K ( ...
- sql查询总结
1.SQL select 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SELECT 列名称 FROM 表名称 实例: SELECT username,pas ...
- 洛谷——P2813 母舰
P2813 母舰 题目背景 广东汕头聿怀初中 Train#3 Problem 1 (有没有红警既视感~) 题目描述 在小A的星际大战游戏中,一艘强力的母舰往往决定了一场战争的胜负.一艘母舰的攻击力是普 ...
- Codeforces 551 D. GukiZ and Binary Operations
\(>Codeforces \space 551 D. GukiZ and Binary Operations<\) 题目大意 :给出 \(n, \ k\) 求有多少个长度为 \(n\) ...
- 【20181019T3】比特战争【最小生成树思想】
题面 [错解] Hmm不可做啊 要不按b排个序? 然后并查集瞎搞,刷刷刷过了样例 然后大样例大了几万倍 出了组小数据,Successful Hack 弃疗 水过10分 [正解] 用占领的边将顶点连起来 ...
- HDU 6053 TrickGCD(分块)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6053 [题目大意] 给出一个数列每个位置可以取到的最大值, 问这个可以构造多少个数列,使得他们的最 ...
- BZOJ 1828 [Usaco2010 Mar]balloc 农场分配(贪心+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1828 [题目大意] 现在有一些线段[l,r]的需求需要满足,i位置最多允许a[i]条线 ...
- 【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
题意:给你一个凸多边形,和多次询问,每次询问给你一条直线,问你这条直线与凸包上的顶点的最近距离是多少. 记当前询问的直线的斜率为K, 先找到与这条直线距离最远的两个点: 就把凸包所有的边当做有向直线进 ...