session即会话,session是一种存储在服务器端的数据,并以此来跟踪和识别用户的机制。session和cookie都是针对HTTP协议的局限性,而提出的一种保持客户端和服务器端之间的会话连接状态的机制。
session的实现可以有很多种,比如URL重写、cookie,通过在cookie中存储sessionid。
和cookie一样,session也是一个通用标准,不同的语言中实现方式有所不同。PHP作为一种Web开发语言,完全支持session机制。对于Web应用来说,session指用户在浏览某个网站时,从进入网站到浏览器关闭这段时间内的会话。由此可知,session实际上是一个特定的时间概念。使用session可以在网站的上下文不同页面之间传递变量、用户身份认证、程序状态记录等。常见的形式就是配合cookie使用,实现保存用户登录状态的功能。
使用session_start()开启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文件,代码如下:
session_start(); // 开启session
$_SESSION['isLogin'] = '1'; // 设置session
echo "new1";
$a = session_name();
$b = session_id(); // 获取sessionid
echo ".$b." target=_blank>new2";
然后,在下一个页面new.php查看session,创建new.php文件,代码如下:
$sessionName = session_name();
$sessionId = $_GET[$sessionName];
session_id($sessionId); // 设置sessionid
session_start(); // 开启session
var_dump($_GET);
echo '
';
print_r($_COOKIE);
echo '
';
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修改如下:
session_start(); // 开启session
var_dump($_SESSION);
再来点击new1,依然可以获取session。
session默认是以磁盘文件的形式存放在服务器端本地硬盘的一个目录中,默认保存位置为:
session.save_path="D:\xampp\tmp"
在高并发的情况下,将session写入文件的方式,效率比较低,这时,可将session存储在redis内存数据库中。
详情可参考:http://blog.csdn.net/lamp_yang_3533/article/details/52578699