Session
- 除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
什么是Session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
PHP 的SESSION
session 使用过期时间设为0 的cookie,并且将一个称为session ID 的唯一标识符(一长串字符串),在服务器端同步生成一些 session 文件(可以自己定义 session 的保存类型),与用户机关联起来。web应用程序存贮与这些 session 相关的数据,并且让数据随着用户在页面之间传递.访问网站的来客会被分配一个唯一的标识符,即所谓的 SESSION ID。它要么存放在客户端的cookie,要么经由 URL 传递.SESSION 允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP会自动(如果session.auto_start 被设为1)或在用户请求时(由session_start()明确调用或session_register() 暗中调用)检查请求中是否发送了特定的SESSION ID。如果是,则之前保存的环境就被重建。
session最最核心的概念就是:网页间跳转的额外数据,保存在服务器,用一个id标识,浏览器要维持session,需要每次提交都带上这个id.
session id的传递有两种方式:
a.通过 cookie 传送 SESSION ID
使用 session_start()调用 session,服务器端在生成session 文件的同时,生成 session ID 哈希值和默认值为PHPSESSID 的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个 128 位的哈希值。服务器端将通过该 cookie 与客户端进行交互。session 变量的值经php内部序列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID 的coolie 进行对应交互.即服务器自动发送了http 头:header(‘Set-Cookie: session_name()=session_id(); path=/’); 即setcookie(session_name(),session_id()); 当从该页跳转到的新页面并调用session_start()后,PHP 将检查与给定ID 相关联的服务器端存贮的session 数据,如果没找到,则新建一个数据集。
b.通过URL传送 session ID
只有在用户禁止使用cookie 的时候才用这种方法,因为浏览器cookie 已经通用,为安全起见,可不用该方法。
// page1.php
session_start();
echo 'Welcome to page #1';
/* 创建 session变量并给 session变量赋值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// 如果客户端使用 cookie,可直接传递 session到page2.php
echo '<br /><a href="page2.php">page 2</a>';
// 如果客户端禁用 cookie
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
/*
默认php5.2.1下,SID只有在 cookie被写入的同时才会有值,如果该 session
对应的 cookie 已经存在,那么 SID将为 (未定义)空
*/
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个 session
var_dump($_SESSION); // 打印出page1.php传过来的 session值
一个简单的示例
session_start();
if (isset($_SESSION['test_sess'])){
$_SESSION['test_sess']++;
}else{
$_SESSION['test_sess'] = 0;
}
echo $_SESSION['test_sess'];
总结:
- 只要使用了session,就会通过cookie的方式向客户端浏览器发送session
- 实际上session完全是一个抽象的概念,session真正要做的,是在除了http提供的get和post提供的参数之外,针对某个用户(可能是个浏览器,或是台电脑,甚至是个ip),能保存额外的信息。如果我们不用系统提供的session,完全也可以传递数据,比如把我们原本要存入session的数据,序列化后再加密,形成一个字符串,在页面上所有的url和form里传递。服务器收到页面请求后,从get或post里取出机密串,揭开,还原数据,实际上和session要做的东西一个样。只不过这种方式超级bt,要实现需要做太多额外的工作。
- session从技术角度讲,就是把在网页链接之间,额外要存储的数据,用一个id命名,保存在服务器端,而浏览器只需要每次get或post的适合,只提供这个id,就能获得之前存储的数据。php默认是用文件来保存数据的。unix下,php一般会在/tmp下面,创建 “sess_”+$session_id 这样的文件名,通过这个名字,就能直接找到session_id对应的数据。 所以session最最核心的概念就是:网页间跳转的额外数据,保存在服务器,用一个id标识,浏览器要维持session,需要每次提交都带上这个id。