热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpsession工作原理分析

session是一个服务器全局变量,为何他可以在不同页面之间切换而不丢失数据并且也不把数据保存在客户端呢,下面我们来看看session工作原理与

session是一个服务器全局变量,为何他可以在不同页面之间切换而不丢失数据并且也不把数据保存在客户端呢,下面我们来看看session工作原理与用法。

众所周知,http协议是一个无状态协议,简单来说就是,web服务器是不知道现在连接上来的人到底是哪个人,为了满足选择性发送信息的需求,在http的基础上做了很多扩展来达到这个目的,如数字签名、COOKIE、session等。 

web服务器或者web程序如何能够知道现在连接上来的是谁?要解决这个问题,首先需要在服务器端和客户端建立一一对应关系,下边我通过抓取http的内容来说明这种对应关系是如何建立的。 

我使用的是一个叫做httplook的http包嗅探工具,然后在本地web服务器的根目录下建立一个叫test.php的文件,地址是:http://localhost/test.php,一切就绪以后我通过浏览器反复打开这个页面,代码如下:

  1. session_start(); 
  2. if (isset($_SESSION['test_sess'])){ 
  3.     $_SESSION['test_sess']++; 
  4. }else
  5.     $_SESSION['test_sess'] = 0; 
  6. echo $_SESSION['test_sess']; 
  7. ?>; 

以下是前两次向服务器发出的信息及服务器返回的信息.

引用:原帖由 "第一次请求服务器" 发表,代码如下:

  1. GET /test.php HTTP/1.1  
  2. Accept: */*  
  3. Referer: http://localhost/  
  4. Accept-Language: zh-cn  
  5. Accept-Encoding: gzip, deflate  
  6. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)  
  7. Host: localhost  
  8. Connection: Keep-Alive 

引用:原帖由 "服务器第一次返回" 发表,代码如下:

  1. HTTP/1.1 200 OK  
  2. Date: Fri, 26 Aug 2005 07:44:22 GMT  
  3. Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2  
  4. X-Powered-By: PHP/5.0.4  
  5. Set-COOKIE: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3path=/  
  6. Expires: Thu, 19 Nov 1981 08:52:00 GMT  
  7. Cache-Control: no-store, no-cache, must-revalidate, post-check=0pre-check=0  
  8. Pragma: no-cache  
  9. Content-Length: 1  
  10. Keep-Alive: timeout=15max=99  
  11. Connection: Keep-Alive  
  12. Content-Type: text/html; charset=utf-8  
  13. Content-Language: Off 

引用:原帖由 "第二次请求服务器" 发表,代码如下:

  1. GET /test.php HTTP/1.1  
  2. Accept: */*  
  3. Referer: http://localhost/  
  4. Accept-Language: zh-cn  
  5. Accept-Encoding: gzip, deflate  
  6. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)  
  7. Host: localhost  
  8. Connection: Keep-Alive  
  9. COOKIE: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3 

引用:原帖由 "服务器第二次返回" 发表,代码如下:

  1. HTTP/1.1 200 OK  
  2. Date: Fri, 26 Aug 2005 07:44:23 GMT  
  3. Server: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2  
  4. X-Powered-By: PHP/5.0.4  
  5. Set-COOKIE: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3path=/  
  6. Expires: Thu, 19 Nov 1981 08:52:00 GMT  
  7. Cache-Control: no-store, no-cache, must-revalidate, post-check=0pre-check=0  
  8. Pragma: no-cache  
  9. Content-Length: 1  
  10. Keep-Alive: timeout=15max=98  
  11. Connection: Keep-Alive  
  12. Content-Type: text/html; charset=utf-8  
  13. Content-Language: Off 

仔细对比这些输出,第二次请求比第一次请求多出来的就是: 

COOKIE: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3 

这个header将会向服务器发送一个COOKIE信息,告诉服务器我有一个COOKIE,名字叫PHPSESSID,内容是bmmc3mfc94ncdr15ujitjogma3。 

这个COOKIE是怎么来的呢?看第一次服务器返回的信息里边有: 

Set-COOKIE: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/ 

这是服务器向客户端浏览器写一个COOKIE,名字是PHPSESSID,值是bmmc3mfc94ncdr15ujitjogma3,这个值实际就是所谓的session_id。 

继续看第二次向服务器发出的请求,仍然向服务器发送了PHPSESSID这个COOKIE

下面我们来看session用法

php中session的用法:PHP中的session默认情况下是使用客户端的COOKIE,当客户端的COOKIE被禁用时,会自动通过Query_String来传递。 

Php处理会话的函数一共有11个,我们详细介绍一下将要用到几个函数。 

1、session_start

函数功能:开始一个会话或者返回已经存在的会话。

函数原型:boolean session_start(void); 

返回值:布尔值

功能说明:这个函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3 

2、session_register

函数功能:登记一个新的变量为会话变量

函数原型:boolean session_register(string name);

返回值:布尔值。

功能说明:这个函数是在全局变量中增加一个变量到当前的SESSION中,参数name就是想要加入的变量名,成功则返回逻辑值true,可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。

3、session_is_registered

函数功能:检查变量是否被登记为会话变量。

函数原型:boobean session_is_registered(string name);

返回值:布尔值

功能说明:这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。

4、session_unregister 

函数功能:删除已注册的变量。

函数原型:boolean session_session_unregister(string name);

返回值:布尔值

功能说明:这个函数在当前的session之中删除全局变量中的变量。参数name就是欲删除的变量名,成功则返回true.

5、Session_destroy

函数功能:结束当前的会话,并清空会话中的所有资源。

函数原型:boolean session destroy(void);

返回值:布尔值。

功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true 

上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:

6、session_encode

函数功能:sesssion信息编码

函数原型:string session_encode(void);

返回值:字符串

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。

7、session_decode

函数功能:sesssion信息解码

函数原型:boolean session_decode (string data)

返回值:布尔值

功能说明:这个函数可将session信息解码,成功则返回逻辑值true

8、session_name

函数功能:存取当前会话名称

函数原型:boolean session_name(string [name]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name 

9、session_id

函数功能:存取当前会话标识号

函数原型:boolean session_id(string [id]);

返回值:字符串

功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id 

10、session_unset

函数功能:删除所有已注册的变量。

函数原型:void session_unset (void)

返回值:布尔值 

功能说明:这个函数和Session_destroy不同,它不结束会话。就如同用函数session_unregister逐一注销掉所有的会话变量

可以得到以下结论:

1、只要使用了session,就会通过COOKIE的方式向客户端浏览器发送session 

2、每次向服务器发出请求的时候,本地浏览器会把COOKIE附带在请求信息中


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
author-avatar
凌亂的回譩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有