Session详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lamp_yang_3533/article/details/53118335

session即会话,session是一种存储在服务器端的数据,并以此来跟踪和识别用户的机制。session和cookie都是针对HTTP协议的局限性,而提出的一种保持客户端和服务器端之间的会话连接状态的机制。

session的实现可以有很多种,比如URL重写、cookie,通过在cookie中存储sessionid。

1. session的基本概念

和cookie一样,session也是一个通用标准,不同的语言中实现方式有所不同。PHP作为一种Web开发语言,完全支持session机制。对于Web应用来说,session指用户在浏览某个网站时,从进入网站到浏览器关闭这段时间内的会话。由此可知,session实际上是一个特定的时间概念。使用session可以在网站的上下文不同页面之间传递变量、用户身份认证、程序状态记录等。常见的形式就是配合cookie使用,实现保存用户登录状态的功能。

使用session_start()开启session,它必须在程序的最开始执行,前面不能有任何输出内容。

2. session的工作原理

HTTP协议本身并不能支持服务器端保存客户端的状态信息,为了解决这一问题,引入了session机制,用它来保存客户端的状态信息。

session通过一个名称为PHPSESSID的cookie和服务器联系,该cookie中存放的是sessionid的值。通过客户端传递过来的sessionid,找到服务器端的session文件,也就是说,session是通过sessionid来判断客户端用户的。

sessionid通过HTTP Request和HTTP Response在客户端和服务器端传来传去。

如果没有设置session的生存周期,sessionid存储在浏览器内存中,关闭浏览器后,sessionid自动注销。如果客户端没有禁用cookie,在启动session的时候,cookie扮演着存储sessionid和session生存周期的角色。session对应的cookie的生存周期就是session的生存周期。

可以手动设置session的生存周期,代码如下:

setcookie ( session_name() , session_id(), time() + 3600 , "/" );

也可使用session_set_cookie_params()函数设置session的生命周期,session过期后,PHP会通过垃圾回收机制处理session。因此,session并非都是随着浏览器的关闭而消失的。

假如,客户端浏览器禁用了cookie,怎么使用session?这时,可以通过URL或者隐藏表单的方式传递sessionid来实现session。

现在,我们通过URL的方式演示一下。首先,禁用浏览器的cookie;然后创建一个a.php文件,代码如下:

<?php
session_start();    // 开启session
$_SESSION['isLogin'] = '1';   // 设置session
echo "<a href=new.php target=_blank>new1</a></br>";
$a = session_name();
$b = session_id(); // 获取sessionid
echo "<a href=new.php?$a=".$b." target=_blank>new2</a>";

然后,在下一个页面new.php查看session,创建new.php文件,代码如下:

<?php
$sessionName = session_name();
$sessionId = $_GET[$sessionName];
session_id($sessionId); // 设置sessionid
session_start();    // 开启session

var_dump($_GET);
echo '<br/>';
print_r($_COOKIE);
echo '<br/>';
var_dump($_SESSION);

可以发现,通过new1点进去时,获取不到session;而通过new2点进去时,可以获取到session。

虽然浏览器禁用cookie后,不能简单地通过以前的方式获取session,但是,我们却可以通过其他方式来传递sessionid后获取session。上面演示的方式,是通过URL手动传递sessionid。

其实,还有一种URL自动传递sessionid的方式,就是修改php.ini配置文件,修改的代码如下:

session.use_trans_sid=1
session.use_only_cookies=0

说明:
session.use_trans_sid 表示是否通过URL方式自动传递sessionid,只要跳转链接(即a标签中href的值)用的不是带有http://前缀的绝对路径,就会在跳转时,在URL地址的后面自动加上sessionid;session.use_only_cookies表示是否强制使用cookie来存储和管理sessionid。

修改php.ini后,重启Apache服务器。
再来点击new1,发现照样获取到了session。这种方式下,其实,还可以通过以前的方式直接获取session。也就是,把new.php修改如下:

<?php
session_start();    // 开启session
var_dump($_SESSION);

再来点击new1,依然可以获取session。

session默认是以磁盘文件的形式存放在服务器端本地硬盘的一个目录中,默认保存位置为:

session.save_path="D:\xampp\tmp"

3. 利用redis存储session

在高并发的情况下,将session写入文件的方式,效率比较低,这时,可将session存储在redis内存数据库中。

详情可参考:http://blog.csdn.net/lamp_yang_3533/article/details/52578699

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页