摘要:本文不再介绍cookie session的基本原理,主要介绍它们的代码操作规范 和 运行流程/机制。
一 . Cookie
setcookie()函数有6个参数,这里我只列举最常用的前四个参数:
bool setcookie(string $name[,string $value[,int $expire[,string $path]]]);
参数说明:
$name
类型:字符串
说明:cookie的识别名字
$value
类型:字符串
说明:cookie的值
$expire
类型:整形(时间戳)
说明:cookie的生存期限,为UNIX时间戳,如果没有设定,该cookie在会话结束被删除
$path
类型:字符串
默认值:不设定或设定为空字符串,为设定cookie的当前目录
说明:服务器端的指定路径,设定后,只有该目录及子目录的脚本可以存取此cookie
需要注意的问题:
- cookie是HTTP标头的一部分,因此setcookie()函数要在其他信息被输出到浏览器之前调用;
- $expire如果要设定,通常是这样 time()+5*60 ,即5分钟后失效;
- $path通常可以设定为’/’,表示在整个服务器目录下的脚本都可以存取此cookie;
删除cookie
<?php
//第一种方法,只设定cookie的名字
//cookie值默认为空,则将该cookie的值置为空字符串,isset($_COOKIE['isLogin'])为true
//生存时间默认为空,那么cookie会在浏览器关闭的时候被删除
setcookie('isLogin');
//第二种方法,设定过期时间为历史时间,那么cookie会被立即删除
//isset($_COOKIE['isLogin'])为false
setcookie('idLogin','',time()-1);
?>
二 . Session
写在前面:可以看到cookie的配置项都在setcookie()函数里面指定,而session的配置是提前在PHP的配置文件里面进行配置,注册和销毁session的时候都不会涉及到过期时间、使用路径的问题。
2.1 配置session
session的配置项都在PHP的配置文件php.ini中,重要的几个配置项如:session.name/session.use_cookies,因PHP运行环境不同,php.ini的位置也不同,这里不进行详述,网上有很多。
而且通常这么都不同再配置了,使用默认值就蛮好的了
我的运行环境是raspberry pi(基于debian的Raspbian版本),记住session文件的位置是/var/lib/php5/sess_*,需要root权限才可以查看session文件。
2.2 注册一个session变量
代码太简单就不说了。
但是注册一个session会话就不简单了,当给一个session变量赋值的时候发生了一下这些事情:
- session变量的变量名和值被保存在服务器端的session文件中;
- 这个session文件命名为sess_SESSIONID,这个SESSIONID是由32位16进制数字组成的字符串;
- 服务器的响应报头里面会有这一行Set-Cookie
PHPSESSID=qielh3lr31aptftavsnj6qfms7; path=/ - 这样就在浏览器端注册了SESSION_ID,以后浏览器请求服务器端脚本都会带上这个SESSION_ID
2.3 注销session变量与销毁session
销毁session的代码如下:
<?php
//第一步:开启session
session_start();
//第二步:删除所有session变量,同时也会删除session文件里面的对应数据
$_SESSION = array();
//第三步:如果使用基于cookie的session,则删除浏览器端的cookie
if(isset($_COOKIE[session_name()])){
setcookie(session_name(),'',time()-1);
}
//第四步:彻底销毁session,其实这里是把session文件删除了
session_destory();
?>
三 . ThinkPHP使用session
访问ThinkPHP的应用,默认开启了session,所以cookie里面就已经有SESSION_ID了,服务器端也已经创建了session存储文件,只是文件是空的。
ThinkPHP使用session()函数来简化session操作。
具体用法可以见官方文档
<完>