PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。


PHP Session 变量
当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态。
通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。


开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。
注释:session_start() 函数必须位于 < html> 标签之前:

<?php session_start(); ?><html>
<body></body>
</html>

上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。


存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:

<?php
session_start();
// store session data
$_SESSION['views']=1;
?><html>
<body><?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?></body>
</html>
输出:
Pageviews=1
在下面的例子中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views"
变量。如果已设置 "views" 变量,我们累加计数器。
如果 "views" 不存在,则我们创建 "views" 变量,
并把它设置为 1:
<?php
session_start();if(isset($_SESSION['views']))$_SESSION['views']=$_SESSION['views']+1;else$_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>

终结 Session
如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。
unset() 函数用于释放指定的 session 变量:

<?php
unset($_SESSION['views']);
?>
您也可以通过 session_destroy() 函数彻底终结 session:
<?php
session_destroy();
?>
注释:session_destroy() 将重置 session,您将失去所有已存储的 session 数据。

cookie 与 session 的区别:

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式
session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如:<form name="testform" action="/xxx"><input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><input type="text"></form>

实际上这种技术可以简单的用对action应用URL重写来代替


使用session

在PHP中使用session非常简单,先执行session_start方法开启session,然后通过全局变量$_SESSION
进行session的读写。session_start();
$_SESSION['test'] = time();
var_dump($_SESSION);
session会自动的对要设置的值进行encode与decode,因此session可以支持任意数据类型,
包括数据与对象等。session_start();
$_SESSION['ary'] = array('name' => 'jobs');
$_SESSION['obj'] = new stdClass();
var_dump($_SESSION);
默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,
会独占这个session文件,这样会导致当前用户的其他
并发访问无法执行而等待。可以采用缓存或者数
据库的形式存储来解决这个问题,这个我们会在
一些高级的课程中讲到。

删除与销毁session:

删除某个session值可以使用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,无法访问。session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在
如果要删除所有的session,可以使用session_destroy函数销毁当前session,
session_destroy会删除所有数据,
但是session_id仍然存在。session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,
$_SESSION才为空,因此如果需要立即
销毁$_SESSION,可以使用unset函数。session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy();
var_dump($_SESSION); //此时已为空
如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,则还需要显式的
调用setcookie方法删除session_id的cookie值

使用session来存储用户的登录信息:

session可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,
或者一些临时使用的暂存数据等。用户在登录成功以后,通常可以将用户的信息存储在session中,一般的会单独的将一些重要的字段单独
存储,然后所有的用户信息独立存储。$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,他们之间的差别在于session
可以方便的存取多种数据类型,而cookie
只支持字符串类型,同时对于一些安全性比较高
的数据,cookie需要进行格式化与加密存储,
而session存储在服务端则安全性较高

<?php
session_start();
//假设用户登录成功获得了以下用户数据
$userinfo = array('uid'  => 10000,'name' => 'spark','email' => 'spark@imooc.com','sex'  => 'man','age'  => '18'
);
header("content-type:text/html; charset=utf-8");/* 将用户信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
echo "welcome ".$_SESSION['name'] . '<br>';//* 将用户数据保存到cookie中的一个简单方法 */
$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
echo "用户信息加密前:".$str;
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secureKey, $str, MCRYPT_MODE_ECB));
echo "用户信息加密后:".$str;
//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str);//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secureKey, base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:<br>";
var_dump($uinfo);

https://my.oschina.net/kevinair/blog/192829

http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html

http://blog.csdn.net/fangaoxin/article/details/6952954/

33. PHP Sessions相关推荐

  1. mahout安装和测试

    Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发者更加方便快捷地创建智能应用程序.Apac ...

  2. oracle 数据库 processes、sessions 的设置

    os: centos 7.4 db: oracle 11.2.0.4 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) ...

  3. Day 33 并发编程3

    目录 Day 33 并发编程3 生产者消费者模型 要解决什么问题 用途 多线程 什么是线程 进程对比线程 为什么用线程 使用线程 线程安全问题 守护线程 线程中的常用方法 Day 33 并发编程3 生 ...

  4. 33. 使用fread()/fwrite()往文件中写入结构体,从文件中读出结构体

    1 //读写结构体 2 #include <stdio.h> 3 typedef struct student 4 { 5 int num; 6 char name[30]; 7 char ...

  5. python 检验数据正态分布程度_python 实现检验33品种数据是否是正态分布

    我就废话不多说了,直接上代码吧! # -*- coding: utf-8 -*- """ Created on Thu Jun 22 17:03:16 2017 @aut ...

  6. 33个2017年必须了解的iOS开源库

    原文 本文翻译自Medium,原作者为 Paweł Białecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Paweł,我是一个独立 iOS 开发者, ...

  7. Exception loading sessions from persistent storage

    严重: Exception loading sessions from persistent storage java.io.EOFException 删除Tomcat里面的work/Catalina ...

  8. SoJpt Boot 2.3-3.8 发布,Spring Boot 使用 Jfinal 特性极速开发

    SoJpt Boot 2.3-3.8 发布了.SoJpt Boot 基于 JFinal 与 Spring Boot制作, 实现了 Spring Boot 与 Jfinal 的混合双打,使 Spring ...

  9. 新日光Q3收入亏损8400万美元缩水33.85%

    台湾太阳能电池生产商新日光能源科技股份有限公司(NSP)第三季度财务报告进一步亏损,相比于第二季度收入缩水33.85%,前三季度净亏损总额达到27.07亿新台币(8,440万美元). 新日光能源面临的 ...

  10. Imagination推出全新多核GPU IP系列:提供33种不同配置,AI算力达24 TOPS

    近日,致力于打造半导体和软件知识产权(IP) Imagination Technologies宣布推出全新的IMG B系列(IMG B-Series)图形处理器(GPU),进一步扩展了其GPU知识产权 ...

最新文章

  1. TensorFlow中设置学习率的方式
  2. 为啥看恐怖片老是忘不掉?最新研究:恐惧记忆的形成方式更利于稳定存储
  3. python学习:time、unixtime、string的转换
  4. 03 ORA系列:ORA-00942 表或视图不存在 table or view does not exist
  5. REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED
  6. javaweb学习总结(二十三):jsp自定义标签开发入门
  7. 世上最经典的25句话
  8. 避免使用FOR –反假战役
  9. 随想录(从DO-178C和ARINC653想到的)
  10. 计算机硬盘和分区是什么关系,电脑硬盘如何分区 电脑硬盘分区注意事项【详解】...
  11. 【从Java转C#】第八章:委托、lambda、事件
  12. 独立后台带分销功能月老办事处交友盲盒微信小程序源码新版,更好的裂变推广引流
  13. 小米平板刷机shell怎么退_小米MI PAD(小米平板)手机快速救砖,线刷教程分享,小白轻松救活手机...
  14. servlet和jsp简介
  15. biopython:1:biopython的安装
  16. 微分,梯度及梯度下降法
  17. web作业之期末工程 “耀炎食品网站”
  18. 《机器学习实战》— k-近邻算法
  19. Android Studio 编译错误小计
  20. UE4+Cubemap(jpg导入UE4生成Cubemap)

热门文章

  1. vijos P1001 谁拿了最多奖学金
  2. 视图控制器的View创建方式
  3. 使用'SAPGUI_SET_PROPERTY'函数是GUI屏幕可见和不可见
  4. k8s数据持久化实验
  5. 100-days: thirty-five
  6. HTTPClient实现免登陆请求(带cookie请求)
  7. [nowcoder]最长区间
  8. SqlServer 2008的tempdb数据文件大小暴增处理
  9. Java annotation 自定义注释@interface的用法 转载记录
  10. WTL学习笔记(5)系统皮肤管理