当前位置: 首页 > news >正文

理解PHP中会话控制

  如果以前没有接触过建站或网络编程,只是从头开始学PHP,以及用PHP来建立动态站点,那么会话(SESSION)对于初学者就有点难理解。那么到底什么是会话呢?理解一个概念需要从它产生的背景或问题出发,所以先回到它身处的Web环境以及它使用的HTTP协议。

  HTTP是无状态协议,也就是说HTTP协议没有一个内建的机制来维护两个事务之间的状态。当一个用户在请求一个页面后再去请求另外一个页面时,HTTP将无法告诉我们这两个请求是来自同一个用户。由此我们就会觉得很奇怪了,平时我们在论坛逛帖子或电商网站购物时,只要我们在这个站点内,不论我们怎么跳转,从一个页面跑到另一个页面,网站总会记得我是谁,比如告诉你购买了哪些东西。这是怎么做到的呢,估计大家猜到了,就是运用本文中提到的会话控制。

  会话控制的思想就是指能够在网站中根据一个会话跟踪用户。那么PHP的会话是如何实现的呢?

  PHP的会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,它由PHP生成,在会话的生命周期中都会保存在客户端。我们知道客户端(也就是浏览器)保存数据的地方只有cookie,所以PHP的会话ID一般保存在用户机器的cookie中。了解cookie后我们知道,浏览器是可以禁用cookie的,这样的话会话功能就不是失效了吗?所以PHP会话控制还有一种模式,就是在URL中传递会话ID。如果在浏览网站时我们稍加留心的话,有些URL中有一串看起来像随机数字的字符串,那么其实很有可能就是URL这种形式的会话控制。

  讲到这里,有些人可能会有疑问了,客户端只是保存一个会话ID,那么会话控制中保存的会话变量比如你购物时买的物品列表等,它们是存放在哪个地方的呢?很显然,会话变量是在服务器端使用的,那么这些会话变量必定存放在服务器端。默认情况下,会话变量保存在服务器的普通文件中(也可以自己配置使用数据库来保存,可以Google一下),会话ID的作用就像是一把钥匙,在服务器端保存会话的文件中找到该会话ID对应的会话变量,比如购买物品的列表。

  那么会话控制的整个过程可能就像这个样子,用户登录或者第一次浏览某个站点的页面时,该站点会生成一个PHP的会话ID并通过cookie发送到客户端(浏览器)。当用户点击该站点的另一个页面时,浏览器开始连接这个URL。在连接之前,浏览器会先搜索当地保存的cookie,如果在cookie中有任何与正在连接的URL相关的cookie,就将它提交到服务器。而刚好在登陆或第一次连接时,已经产生了一个与该网站URL相关的cookie(保存的会话ID),所以当用户再次连接这个站点时,站点就可以通过这个会话ID识别出用户,从服务器的会话文件中取出与这个会话ID相关的会话变量,从而保持事务之间的连续。

  下面开始实际介绍PHP的会话功能。

  使用会话的基本步骤如下:

  1)开始一个会话

    调用session_start()函数即可,函数的具体功能可以查阅PHP的文档。需要注意的是,必须在使用会话的脚本开始部分调用这个函数,如果没有,所有保存在该会话中的信息都无法在脚本中使用。除了手动调用session_start()函数外,也可以自动配置PHP自动调用,可以Google之。

  2)注册一个会话变量

    从PHP4.1以后,会话变量保存在超级全局数组$_SESSION中。要创建一会话变量,只需要在数组中设置一个元素,如$_SESSION['myvar'] = 5;

  3) 使用一个会话变量

    要使用一个会话变量很简单,使用$_SESSION数组访问保存的会话变量即可,如 echo $_SESSION['mywar']; 会打印出 5。使用会话前必须首先使用session_start()函数启动一个会话。

  4)注销变量和销毁会话

    注销变量直接使用unset即可,如unset($_SESSION['myvar']),如何要一次销毁所有会话变量,可以使用 unset($_SESSION); 当使用完一个会话后,首先应该注销所有的变量,然后再调用session_destroy() 来清除会话ID。

  接下来,我们通过一个简单的会话例子来结束本文。在这个例子中,我们实现了3个页面。

<?php
//page1.php 启动一个会话并注册一个变量

session_start();

$_SESSION['sess_var'] = "Hello, world!";

echo 'The content of $_SESSION[\'sess_var\'] is ' . $_SESSION['sess_var'] . '<br />';
?>
<a href="page2.php">Next Page</a>
<?php
//page2.php 访问一个会话并注销它

session_start();

$_SESSION['sess_var'] = "Hello, world!";

echo 'The content of $_SESSION[\'sess_var\'] is ' . $_SESSION['sess_var'] . '<br />';

unset($_SESSION['sess_var']);

?>
<a href="page3.php">Next Page</a>
<?php
//page3.php 结束会话

session_start();

echo 'The content of $_SESSION[\'sess_var\'] is ' . $_SESSION['sess_var'] . '<br />';

session_destroy();

?>

  然后访问page1.php然后依序点击Next Page,可以发现浏览器中输出中page1 和 page2都可以看到$_SESSION['sess_var']的值,page3则为空了。

  结合这个例子,我们就更好的理解了会话在PHP中的使用方法。

  

转载于:https://www.cnblogs.com/zhenyu-whu/archive/2012/11/21/2780312.html

相关文章:

  • LAMP架构应用实战—Apache服务介绍与安装01
  • asp.net向页面注册脚本
  • Unity 3D调用Windows打开、保存窗口、文件浏览器
  • Snapchat为Mac、Windows平台推出AR新工具,方便用户创造实景物体
  • 2003系统创建软RAID磁盘阵列完全手册
  • 如何解决临时空间暴增导致磁盘满问题?
  • 网络负载平衡
  • Linux的基本指令--目录和文件和文件属性和文件用户组
  • Hessian解析及应用(整合Spring)
  • 用Qemu运行/调试arm linux【转】
  • OpenCV 2.4+ C++ SVM文字识别
  • 深入剖析 iOS 性能优化
  • AIX学习之—存储管理(LVM)
  • KEUC首次落地中国,网易云深度剖析Kubernetes优化与实践
  • 当人工智能遇上区块链,会发生什么?
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Android 架构优化~MVP 架构改造
  • eclipse的离线汉化
  • es6
  • Golang-长连接-状态推送
  • HTTP中的ETag在移动客户端的应用
  • isset在php5.6-和php7.0+的一些差异
  • js
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MySQL几个简单SQL的优化
  • nodejs:开发并发布一个nodejs包
  • Quartz初级教程
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Windows Containers 大冒险: 容器网络
  • 给github项目添加CI badge
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 正则学习笔记
  • zabbix3.2监控linux磁盘IO
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)bark-ml
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (9)目标检测_SSD的原理
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (八)Spring源码解析:Spring MVC
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)计算机毕业设计大学生兼职系统
  • (算法)Travel Information Center
  • (一)基于IDEA的JAVA基础1
  • (转)原始图像数据和PDF中的图像数据
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net framework profiles /.net framework 配置
  • .NET 表达式计算:Expression Evaluator
  • .net 托管代码与非托管代码