从php4.0开始引入了对会话的支持,从来可以很方便的通过会话来存储变量值,
尽可能减少对数据库的操作,从而减轻了对系统的负载量,更加方便、灵活的操作数据。
PHP为我们提供了2种会话的解决方案: cookie 和 session
1. PHP的COOKIE
cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。
1.1 设置cookie: (会话cookie 、 持久cookie)
可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name: cookie变量名
value: cookie变量的值
expire: 有效期结束的时间,
path: 有效目录,
domain: 有效域名,顶级域唯一
secure: 如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
httponly: 如果为1,则cookie只能通过HTTP协议来访问,而不能通过脚本来访问,很好的避免了XSS攻击。
例子:
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>
设置多个cookie变量: setcookie('var[a]','value');
用数组来表示变量,但它的下标不用引号.(会自动加上下标,如果加上引号会出现重复或者可能会被转义,下标不可用)
这样就可以用$_COOKIE['var']['a']来读取该COOKIE变量.
1.1.2. 使用header()设置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setcookie函数的参数一样.
比如:
$value = 'something from somewhere';
header("Set-Cookie:name=$value");
1.1.3. Cookie 的存放位置
不同的浏览器保存Cookie的位置都不一样,甚至保存格式都是不一样的。
已IE和firefox为例:
IE是把cookie保存在C:\Documents and Settings\用户名\Cookies中,每个cookie是一个txt文件,文件名是以“用户名@网站URL”命名的;
firefox则是把cookie保存在C:\Documents and Settings\用户名\Application Data\Mozilla\Firefox\Profiles\随机目录,
在目录下可以看到一个cookie.sqlite文件(firefox3.X版本),所有的cookie都是保存在这个文件中。
1.2 Cookie的读取:
直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
print $_COOKIE['TestCookie'];
1.3 删除cookie
(1)只需把有效时间设为小于当前时间
(2)把值设置为空.
例如: setcookie("name","",time()-1);
用header()类似.
1.4 常见问题解决:
1) 用setcookie()时有错误提示(headers already sent ...),可能是因为调用setcookie()前面有输出或空格.
也可能你的文档是从其他字符集转换过来,文档可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).
解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持cookie
1.5 cookie工作机理:
a) 当客户端初次请求服务器的时候,如果服务器端有设置cookie的语句,则服务器通过随着响应发送一个http的Set-Cookie头,在客户端中设置一个cookie文件。
b) 当客户端再次向服务器端发送一个http请求的时候,浏览器会把本地保存该请求地址的cookie信息发送到服务器,服务器会自动读取,并将其转换成 $_COOKIE 全局变量,方便调用。
2. PHP中的Session
如果使用session的会话机制,用户每次来访问网站时,都会为每一个访问者创建一个唯一的标示符来区分客户的身份。
这种标示符被成为会话ID(SID),其实SID就是session文件的文件名,具有唯一性和随机性,以确保session的安全。
SID 2种传递方式: cookie 或者 URL传递
session_start()
① 为当前访客分配一个唯一的session_id
② 在访客的客户端生产一个存放 session_id 的cookie 此cookie名默认为 PHPSESSID
③ 在服务器端生成一个session文件,用来存放该访客的所有的会话信息。 session文件名为 sess_session_id的值 (前提:服务器设置的session存放方式为files)
session通常使用过期时间为0的cookie,并且将一个称为session ID的唯一标识符作为cookie的值,
在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.并且让数据随着用户在页面之间传递.
要使用session,首先必须通过session_start()来开启一个会话。
2.1 sessionID的传送 (cookie 和 URL)
2.1.1 通过cookie传送sessin 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数据,如果没找到,则新建一个数据集.
2.1.2 通过URL传送session ID
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>,也可以通过POST来传递session值.
2.2 session基本用法实例
<?php
// 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将为(未定义)空
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>
2.3 删除session
要三步实现.
<?php
session_destroy(); // 第一步: 删除服务器端session文件,这使用
setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session:
$_SESSION = array(); // 第三步: 删除$_SESSION全局变量数组
?>
2.4 常用session函数:
bool session_start(void); 初始化session
bool session_destroy(): 删除服务器端保存session信息的文件
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array session_get_cookie_params() 与这个session相关联的session的细节.
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini session_cache_expire() 控制客户端缓存时间
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id, 用一个新的session_id替换掉当前的session_id, 保存原有的session信息到新的session文件中, 如果参数为true的话,会同时删除原有的session文件,