session和cookie大家都知道的区别
说到 session 和 cookie 这一对兄弟,大家都有认识,基本上都能说出几点:1、session 存储在服务器,cookie 存储在客户端;2、cookie 是可以被浏览器禁用的,3、cookie 是保存在文件中的……
我认识到的session和cookie的联系
引用书上原话“我们可能曾经听说过 'HTTP是我状态的协议' 。这是说,HTTP 协议没有一个内建机制来维护两个事务之间的状态。当一个用户在请求一个页面后再请求另外一个页面时,HTTP 将无法告诉我们这两个请求是来自同一个用户。
因此,我们需要会话控制!通过会话控制,我们能在同一个网站中跟踪一个用户,保存他的登录状态,保存他的操作记录,保存他的操作习惯等等。
或许你可以说,这些通过 cookie 就足以,因为在客户端与服务器中都可以操作 cookie ,但这略有些不妥,举个简单的样子,大家或许都知道 cookie 是保存在客户端的,因此,是可以被随意更改的,如果我们仅使用 cookie 来判断用户的登录状态的话,那无异于“洞门大开,菊花向阳”。
我们使用用不同的客户端请求php文件时,用的是同一个变量如:$_SESSION[ ' name' ],取出来的值是不一样的,那是因为 php 的会话ID保证了会话变量所指向值的唯一性。该唯一的会话ID便是php会话机制的一个驱动,用一串加密的随机数字来保证其唯一性。则php生成,通常情况下,保存在cookie中,当浏览器禁用cookie时,通过url传递。使用大多数的浏览器开发者工具都可以看到,比如使用chrome的开发者工具:
当删除该cookie后,将不可请求php程序。
对于客户端来说,这个cookie与其它使用setcookie()方法生成的cookie无异,但对于生成来说,它有着自己独自的生成机制。首先它是自动生成的,然后,关于生成PHPSESSID的参数都是可以通过php.ini的来配置的,比如是否自动生成,超时时间,生成方法,保存路等,详见第四点。配置会话变量。
注册与注销会话变量
php 的会话管理是随着 session_start() 开始的,调用该函数启动会话后,便可以使用$_SESSION这个全局数据了。如果重复调用session_start() ,不会报错。但是会有Notice,所以,如果喜欢日志文件简洁的同学,可以在调用该方法前先进行会话是否已开启的判断:
if ( !isset($_SESSION) ){
session_start();
}
当使用完一个会话变量后,应将其注销。只注销特定变量时,建议使用:
unset( $_SESSION['name'] );
如需要彻底注销,先将$_SESSION置空,再消除会话ID:
$_SESSION = array();
//消除会话ID
session_destroy();
配置会话变量
session.auto_start 0(被禁用) 自动启动会话
session.cache_expire 180 为缓存中的会话页设置当前时间,精确到分钟
session.cookie_domain none 指定会话cookie中的域
session.cookie_lifetime 0 cookie会话ID将在用户的机器上延续多久。默认值0
表示延续到浏览器关闭
session.cookie_path / 在会话cookie中要设置的路径
session.name PHPSESSID 会话的名称,在用户系统中用作会话名
session.save_handle files 定义会话数据保存的地方。可以将其设置为指向一个
数据库,但是需要编写自己的函数
session.save_path /tmp 会话数据存储的路径。更通常的情况下,传递给存储
的参量由session.save_handle函数来处理和定义
session.use_cookie 1(允许使用) 配置在客户端使用cookie的会话
当然,我此处只是针对 php5.3 的配置选项简述,想了解真相的,敬请看官方文档: http://cn2.php.net/manual/zh/session.configuration.php 中英文可自选