php中的cookie和session

注意:Cookie是HTTP标头的一部分,因此setCookie()函数必须在其他信息被输出到浏览器前调用,所以即使是空格或空行,都不要在调用setCookie()函数之前输出
1. cookie的设置有两种方式:

  • 设置cookie变量
  • 设置cookie数组
    以下是代码实例:
setcookie("mtg","mmm");
echo $_COOKIE["mtg"];//输出mmm

setcookie("user[username]", "abcd");
setcookie("user[password]",md5("123456")); 
setcookie("user[email]", "xxx@163.com");

foreach($_COOKIE["user"] as $key => $value){
    echo $key.":".$value."</br>";
}
//输出username:abcd
//password:e10adc3949ba59abbe56e057f20f883e
//email:xxx@163.com

2.删除Cookie:有2种方式删除Cookie:

  • setcookie()时,只输入第一个参数,第二个参数相当于null
setcookie("mtg");
  • 设置cookie为已过期
setcookie("mtg","",time()-1);

session

  原理:当第一次访问网站时,Seesion_start()函数就会创建一个唯一的Session ID,并自动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建一个以Session ID命名的文件,用于保存这个用户的会话信息。当同一个用户再次访问这个网站时,也会自动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配一个新的Session ID,而是在服务器的硬盘中去寻找和这个Session ID同名的Session文件,将这之前为这个用户保存的会话信息读出,在当前脚本中应用,达到跟踪这个用户的目的。 Session以数组的形式使用,如:$_SESSION[‘session名’]
  注意:session_start()函数之前不能有任何输出
  
1. 执行以下代码后,两个Session变量就会被保存在服务器端的某个文件中,该文件的位置是通过php.ini文件,在session.save_path属性指定的目录下

session_start();
$_SESSION["mtg"]=123;
$_SESSION["mm"]=456;
var_dump($_SESSION);//输出array(2) { ["mtg"]=> int(123) ["mm"]=> int(456) }

2.session_destroy()销毁和当前Session有关的所有的资料,可以调用session_destroy()函数结束当前的会话,并清空会话中的所有资源。该函数并不会释放和当前Session相关的变量,也不会删除保存在客户端Cookie中的Session ID
3. 销毁存储的session变量有两种方式
- unset( SESSION[]);session _SESSION=array();销毁全部的session变量
以下是实例代码:

session_destroy();
var_dump($_SESSION); //输出array(2) { ["mtg"]=> int(123)["mm"]=> int(456) }

unset($_SESSION['mtg']);
var_dump($_SESSION);//输出array(1) { ["mm"]=> int(456) }

$_SESSION=array();
var_dump($_SESSION);//输出array(0) { }

PHP默认的Session是基于Cookie的,Session
ID被服务器存储在客户端的Cookie中,所以在注销Session时也需要清除Cookie中保存的SessionID,而这就必须借助setCookie()函数完成。在PHP脚本中,可以通过调用session_name()函数获取Session名称。删除保存在客户端Cookie中的Session

var_dump($_COOKIE[session_name()]);//string(26)"olo16sl2urim2ou0c8o4221ck0"等价于session_id()

if(isset($_COOKIE[session_name()])){
    //删除包含Session ID的cookie,注意第四个参数一定要和php.ini设置的路径相同
    setcookie(session_name(),'',time()-3600,'/');

通过一上可以看出Session的注销过程共需要4个步骤

<?php
//第一步:开启Session并初始化
session_start();

//第二部:删除所有Session的变量,也可以用unset($_SESSION[XXX])逐个删除
$_SESSION = array();

//第三部:如果使用基于Cookie的session,使用setCookkie()删除包含Session ID的cookie
if(isset($_COOKIE[session_name()])) {
    setCookie(session_name(), "", time()-42000, "/");
}

//第四部:最后彻底销毁session
session_destroy();

php.ini中sesion的参数配置

session.auto_start = 0 ; 在请求启动时初始化session
session.cache_expire = 180 ; 设置缓存中的会话文档在 n 分钟后过时
session.cookie_lifetime = 0 ; 设置按秒记的cookie的保存时间,相当于设置Session的过期时间,为0时表示直到浏览器被重启
session.auto_start=1,这样就无需每次使用session之前都要调用session_start()不建议使用.但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。
session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.name = PHPSESSID; 用在cookie里的session的名字
session.save_handler = files ; 用于保存/取回数据的控制方式
session.save_path = /tmp ; 在 save_handler 设为文件时传给控制器的参数, 这是数据文件将保存的路径.
session.use_cookies = 1 ; 是否使用cookies
session的垃圾回收装置:用户可以通过session_destroy()函数在页面中提供一个“退出”按钮,通过单击销毁本次会话。销毁服务器端的session,但如果用户没有单击退出按钮,而是直接关闭浏览器,或断网等情况,在服务器端保存的Session文件是不会删除的,垃圾回收程序”是在调用session_start()函数时启动的垃圾回收程序,启动后就是根据Session文件的修改时间,将所有过期的Session文件全部删除。通过在php.ini中设置session.gc_maxlifetime选项来指定一个时间,例如设置该选项值为1440(24分钟)。“垃圾回收程序”就会在所有Session文件中排查,如果有修改时间距离当前系统时间大于1440秒的就将其删除。可以通过php.ini文件中修改“session.gc_probability
session.gc_divisor”两个选项,设置启动垃圾回收程序的概率。会根据“session.gc_probability/session.gc_divisor”公示计算概率,例如选项session.gc_probability=1,而选项session.gc_divisor=100,这样的概率就是“1/100”,即session_start()函数被调用100次才会有一次可能启动“垃圾回收程序”。

当cookie被禁用时:

  • 在使用Linux系统做服务器时,则在编辑PHP时如果使用了–enable-trans-sid配置选项,和运行时选项session.use_trans_sid都被激活,在客户端禁用Cookie时,相对URL将被自动修改为包含会话ID。
  • 如果没有这么配置,或者使用Windows系统作为服务器时,可以使用常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件地将其嵌入到URL中去。在下例中使用两个脚本程序,演示了Session ID的传送方法。
    test1.php
<?php
session_start();

$_SESSION["username"]="admin";

echo "session ID:".session_id()."<br>";

?>

<a href="test2.php?<?php echo SID ?>">通过URL传递Session ID</a>
//

test2.php

<?php 
session_start();

echo $_SESSION["username"]."< br>";
echo "session ID:".session_id()."<br>";
?>

test1.php代码输出为:session ID:bq8oiqhiqnpski4la09d008h14 通过URL传递Session ID,当点击超链接后:admin< br>session ID:bq8oiqhiqnpski4la09d008h14,session ID传递成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值