原文: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中的代码:

 <?phpsession_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)相关推荐

  1. php 1 second,php中的会话机制(1)

    ①什么是会话机制: 这个太过抽象,也挺复杂的,只能说一下自己的理解.在b/s架构下,会话机制,其实就是服务器(server)和浏览器(browser)之间的对话的一种方式!这种对话方式,能够使得web ...

  2. PHP中session特点及用途,PHP特点之会话机制2——Session及其使用

    会话机制(Session)在 PHP 中用于保存并发访问中的一些数据.这使可以帮助创建更为人性化的程序,增加站点的吸引力. 一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 ...

  3. 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...

    1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...

  4. WordPress中的cookie 机制

    2019独角兽企业重金招聘Python工程师标准>>> WordPress中的cookie机制 WordPress使用cookies技术(能够让网站服务器把少量数据存储到客户端的硬盘 ...

  5. 从实例入手学习Shiro的会话机制

    场景 从实例入手学习Shiro与Web的整合: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90140802 在上面已经实现整合 ...

  6. 33、JAVA_WEB开发基础之会话机制

    会话是什么 一个客户端浏览器与web服务器之间连续发生的一系列请求和响应过程就是会话,这些过程中产生的一系列信息就是会话信息,会话机制就是用于维护这些信息一致性的一种技术.通俗的说就是,一个A账号访问 ...

  7. 细说WCF中的会话模式

    大家都知道WCF会话模式有几个要求:1.会话契约:2.绑定支持:3.实例模式为PerSession.这几个要素是WCF支持的必要条件. 会话契约:由服务端提供实现,客户端调用时只持有契约定义,所以需要 ...

  8. Unix/Linux 中的 shell 机制

    Unix/Linux 中的 shell 机制 对于初次接触 Unix/Linux 系统的同学来说,Unix/Linux 系统与 Windows 系统最大的不同就是,操作 Unix/Linux 系统更多 ...

  9. VoLTE技术中的会话持续性-SRVCC

    目录 IMS中的会话持续性概念 会话持续性的范围 移动IP.SRVCC实现语音业务切换的思路分析 双模终端的类型 SRVCC架构分析 SRVCC的网元     1,eMSC向IMS发出SRVCC切换请 ...

最新文章

  1. 高压发生器的输出电压波形
  2. 二、数据分析前,打下数据处理基础(上)
  3. 如何启动和关闭oracle数据库,Oracle数据库启动和关闭方式总结
  4. 查询工资最低的3名员工的职工工号、姓名和收入_工资条6个常识必须掌握,事关你的权益!...
  5. 稳居TIOBE前三,涨幅No.1,Python做了什么?
  6. python账户密码_python02 用户名密码
  7. 【最新消息】阿里宣布无限期延迟复工,字节跳动、腾讯......等企业也再次延迟!...
  8. 飞思卡尔c语言,飞思卡尔MCU的C语言编程框架
  9. 卸载win10预装软件和小娜
  10. 2022PMP考试敏捷知识点(2)
  11. keil4和烧录软件的基本使用
  12. 卡内基梅隆大学计算机系难考,考出托福成绩 成功申请卡内基梅隆大学计算机科学专业...
  13. Android简易实战教程--第三十七话《NotifiCation》
  14. linux服务器告警信息:Free inodes is less than xx% on /volume 排查
  15. 《让大象飞》阅读心得
  16. python将字典按行或按列写入csv文件
  17. Python Set 与 dict
  18. 在两台 ubuntu 之间传输大文件
  19. 惯性导航的定位原理是什么?
  20. php连接mysql错误:Call to undefined function mysql_connect()

热门文章

  1. 决定微型计算机最主要的部件是,【单选题】决定微型计算机性能的最主要部件是( )。A. 内存 B. 硬盘 C. CPU D. 显示器...
  2. 360浏览器 兼容模式下页面显示异常(出现不改出现的HTML标签)
  3. SP3232 V+引脚的电容接到哪里好?
  4. Linux CentOS 7 最详细的zimbra开源邮件服务器安装搭建
  5. 获取本机所有网卡的网卡名、网卡描述、网卡MAC地址、网卡IP、网卡类型等信息及网线是否插入状态
  6. GPS和北斗导航都能被欺骗,你还敢用导航吗?
  7. Prometheus 报错 Error refreshing service Unexpected response code: 503 解决办法
  8. i.MX8MM开发板Android9移植4内核配置开启ppp协议
  9. 计算机wps文字基础知识,全国计算机等级考试一级WPSOffice考试大纲
  10. WordPress付费会员制虚拟资源下载网站主题Blackcat主题