首先要说明一下自己开始学习session的一些疑问,当然现在看来有些问题是我多虑的:
1.作者当时对session的工作机制十分的朦胧,从而对session和cookie之间的合作产生很大的疑惑;
2.由于上面的问题一直缠绕着我,于是在学习session就产生另外一个问题:session是通过从客户端中的cookie返回一个session_id到服务器,然后服务器根据返回的session_id来打开对应session文件,从而获得session信息。而客户端cookie如果同名的话,前一个cookie会被后来写入的那个cookie冲掉。那么如果在同一个浏览器同时登陆两个用户,这样的话就不是不能识别用户的session吗?
3.服务器是根据客户端发来的cookie中获取session_id的,而从客户端发送过来的cookie不止一个,那么服务器如何知道或者说从这些cookie中挑选出哪一个代表存储session_id的呢?这个作者认为(或许就是如此)服务器根据cookie的名称来检查那个cookie存储session_id,而存储session_id的那个cookie名称就是跟服务器配置文件php.ini中的session.name是一样的,或者在php文件用session_name('')函数来指定。如一般的服务器的session.name=PHPSESSID,那么服务器就应该检测那个cookie名称是PHPSESSID。
接下来是逐个回答上面的问题:
1.对于session的工作机制,其实网上有很多的资料,我再这里就简单的叙述一下吧。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识称(即与php.ini中的session.name是一样的,或者在php文件用session_name('')函数来指定的名称一样),如果已包含这样一个session标识称则说明以前已经为此客户端创建过session,服务器就按照该cookie的值(即session_id)把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid标识称,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。
2.对于第二个问题,其实现在大多数的网站都不支持同时登陆两个用户(同一浏览器),要不就是先将已登录的用户注销掉在登陆。
3.对于第三个问题,我想展示一段程序:
a.php:
<?php
session_name('username');
session_start();
$_SESSION['name']='name';
header("Location:view.php");
?>
view.php:
<?php
session_start();
echo session_name().'<br />';
if(isset($_SESSION['name']))
echo $_SESSION['name'];
else
echo "no session";
?>
那么最后输出是:
PHPSESSID
no session
如果将view.php修改成如下:
<?php
session_name('username');
session_start();
echo session_name().'<br />';
if(isset($_SESSION['name']))
echo $_SESSION['name'];
else
echo "no session";
?>
则输出:
username
name。
从上面两个程序来看,如果一个指定sessionname,一个不指定sessionname,则运行a.php首先会在本地产生以个名为username的cookie,值为session_id,而对于view.php来说,它的sessionname依然是PHPSESSID(假设php.ini中session.name=PHPSESSID),这样服务器通过检测传送过来的cookie,发现没有cookie其名称是PHPSESSID,所以就没有$_SESSION['name']这个变量,并且因为view.php也有session_start(),所以这是在会后查看浏览器的cookie会发现多了一个名为PHPSESSID的cookie。对于两个都指定sessionname的程序,就不会出现上面的问题,正常运行。所以证明了我上面所说的。