php中的会话机制(2)

session 会话机制:

1)若是是基于cookie的会话机制,在调用session_start()以前,是不可以有任何实际的输出的,即便是空格或者是空行!

由于session_start()函数调用的时候,实际上是经过setCookie()函数向cookie中设置了
PHPSESSID这个key,对应的value是一个随机的、惟一的32位字符串! 而setCookie前面是不能够有任何实际的输出的!php

注意:这里的PHPSESSID名字是在php.ini文件中进行的配置!配置以下图所示:ajax

sessionname

2)这里咱们须要明白session_start()函数的做用到底是什么:

①若是session机制是基于cookie的,那么当脚本第一次运行的时候
A、 在客户端上session_start()函数会经过setCookie()函数向Cookie中保留一个key,默认状况下Key的名字是PHPSESSID,对应的值是一个32位的、惟一的、随机的字符串!
B、 在服务器端,会产生一个以PHPSESSID的value值为名字的文件!其中保留的是session中的数据!同时,在脚本中建立$_SESSION超全局数组,并将session文件的数据反序列化,添加到$_SESSION数组中!segmentfault

②当脚本第二次,及之后运行的时候
A、 浏览器端会自动携带COOKIE中的PHPSESSID对应的value值,将数据送至服务器端!
B、在服务器端,一旦开启sessioin_start()的时候,会根据客户端提供的sessionid去寻找对应的session文件,将session中的变量读取出来!在脚本中建立$_SESSION超全局数组,将数据定义到$_SESSION数组中!数组

注意:$_SESION数组数组只有在调用session_start()函数以后,更确切确切的说,是开启session机制以后]才会存在!之因此这样说,是因为session_start()时,会先获得session_id,经过session_id找到对应的文件内容,而后进行反序列化!若是,咱们接着使用session_id()函数来滞空session_id的话,咱们就找不到session中的内容了!
同时,$_SESSION是超全局定义数组,他和常量同样,并无做用域的概念!几乎在哪里均可以使用!浏览器


接下来,咱们来看一点代码!当咱们第一次运行这个脚本,脚本代码以下 脚本A中的代码:服务器

<?php
 session_start();
 $_SESSION['name']='maweibin';
 ?>

服务器端保存session文件夹中的的文件入下:cookie

请输入图片描述

代码中的保值至以下:session

请输入图片描述

在客户端保存了一个cookie文件,内容以下:dom

请输入图片描述

经过观察咱们能够发现:PHPSESSIONID对应的value值和服务器端session文件的文件名是一致的!函数

第二次及其之后运行这个脚本的时候,在服务器端,并无什么变化

在客户端,发起http请求的时候,咱们能够看到:

请输入图片描述

请求的时候会字段的将cookie中的PHPSESSID带到服务器端!服务器端,会经过提供的sessionid值,将session文件中的数据读取出来!

3)同cookie不一样的是,session中的数据不只能够存放字符串,还能够存放数组和对象!

<?php
session_start();
$name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省');
$_SESSION['voice'] = $name;
?>
<?php
session_start();
var_dump($_SESSION['voice']);
?>

运行的结果以下:

array(3) { ["name"]=> string(3) "jay" ["age"]=> string(2) "23" ["addr"]=> string(9) "吉林省" }

注意:这里咱们有必要讨论一下,为何cookie中不能存放数组之类的变量,而只可以存放字符串!咱们来看几段代码:

<?php
session_start();
$name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省');
$_SESSION['voice'] = $name;
?>
在session文件中存储的数据以下:
name|s:8:"maweibin";voice|a:3:{s:4:"name";s:3:"jay";s:3:"age";s:2:"23";s:4:"addr";s:9:"吉林省";}

<?php
$expires = time()+3600;
$name = array('name'=>'jay', 'age'=>'23', 'addr'=>'吉林省');
setcookie('name',$name, $expires, '/talkphp/secondtalk/', 'php.test.com');
?>
此时,咱们调用一下这段脚本:
<?php
$name = $_COOKIE['name'];
var_dump($name);
获得的结果是null,因而可知这样的写法是不支持的!
?>

咱们再看一段代码:
<?php
$expires = time()+3600;
setcookie('person["name"]','liangbo' , $expires, '/talkphp/secondtalk/', 'php.test.com');
setcookie('person["age"]','23' , $expires, '/talkphp/secondtalk/','php.test.com');
?>
运行结果以下:
array(2) { [""name""]=> string(7) "liangbo" [""age""]=> string(2) "23" }

虽然也取到了数据,可是,cookie中的数据却和session中的数据并不相同!可是,咱们来看一下cookie文件中存储的数据
person["name"]
liangbo
php.test.com/talkphp/secondtalk/
0
976582400
30365600
3634030379
30365591


person["age"]
23
php.test.com/talkphp/secondtalk/
0
976582400
30365600
3634060380
30365591

因而可知,cookie之因此不可以保存数组或者是对象等变量,是由于cookie自己并无序列化,和反序列化这一步!这也提示咱们,若是,咱们手动将将变量进行了序列化和反序列化,就能够用cookie来存储变量了!

4)删除session数组须要注意的地方:

咱们可使用unset()方法干掉$_SESSION[‘key’] ,这样能够单独的干掉一个值,此时$_SESSION数组依然存在!
可是,若是咱们须要清空session中的所有数据的时候,是不可以直接unset($_SESSION)。这样在当前脚本周期以内,超全局定义数组$_SESSION 就不存在了!咱们也就没有办法操做session中的数据了!

咱们来看一段代码:
<?php
var_dump($_SESSION);
session_start();
var_dump($_SESSION);
unset($_SESSION);
session_start();
var_dump($_SESSION);
?>
运行以下:
NULL     array(0) { }    NULL

从上面的代码中,咱们至少能够得出两个结论:
① 开启session机制前,$_SESSION数组是不存在的!
② $_SESSION 数组在脚本周期内,一旦被干掉,就不会再产生!即便从新开始session机制以后,该数组也并无出现!

所以,咱们想要清空$_SESSION 中的数据的话,就须要使用$_SESSION = array()的形式,这样可以在脚本周期以内,保证$_SESSION数组的存在!

5)cookie中的值保存改变的问题!

有的时候,咱们须要对cookie中的值进行重写!若是,后面并无跟路径名、域名、过时时间的话,简单的进行重写就能够了!
可是,若是cookie中保存了这些参数,而咱们从新设定值的时候,并无设置相关参数,这些参数还会被完整保留下来么?仍是没有了?看代码:

<?php
//文件路径: /talkphp.php
$expires = time()+3600;
setcookie('name','liangbo' , $expires);
运行结果以下图
?>

请输入图片描述

<?php
//文件路径:    /secondtalk/se
setcookie('name','maweibin');
?>

请输入图片描述

<?php
$name = $_COOKIE['name'];
echo $name;
?>

从上面的代码中,咱们能够得出如下结论:

①原有cookie中保存的值,是否被后来的cookie值是否被覆盖取决于,两个参数:
(1)path路径
若是在同一个域名,可是不一样的路径下,设置了同名的cookie,那么该域名下回保存两个cookie,依据路径的不一样,选择使用哪个cookie(由于cookie中的key相同,那么只能依靠path路径进行区分!)
(2)domain域名。很明显,不一样域名下的cookie确定是两个,同名的话,也不冲突

②若是在同一个域名、同一个路径下,设置了同名的cookie,那么后面的cookie值会覆盖前面的值!
path路径、过时时间、所在域名都以最后一个cookie的为准!若是,该cookie并无设置这些参数,那么cookie会话机制,会进行自动的填充!
path路径,以当前的运行脚本路径为准! 过时时间,就是一个会话周期,浏览器关闭后,就消失! domain域名,就是url中的域名!

6)cookie携带的问题

通过试验证实,凡是从浏览器端发起的请求,在访问同一个域名的时候,cookie是会被自动携带到服务器端的,不管是经过url访问、仍是经过ajax调用访问cookie都是会被自动携带的! 注意:只有是从客户端发起的请求,cookie才会被自动携带!

相关文章
相关标签/搜索