Cookie和SESSION是数据的临时档案馆。
Cookie将数据存储在客户端,实现数据的持久存储。
SESSION将数据存储在服务器端,保证数据在程序的单次访问中持续有效。
有了Cookie和SESSION这个临时档案馆,就可以解决HTTP Web协议的无状态问题,实现数据在不同页面之间的传递(如通过SESSION存储的数据来判断用户的访问权限)和数据在客户端的持久存储(如通过Cookie存储论坛用户的登录信息,实现用户下次在本机登录时,不需要输入用户名和密码,可以直接登录)。对于Web网站的开发,这是两项至关重要的内容,是学习者必须掌握的知识。
一、SESSION会话
session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经历的时间。当登录网站时,启动session会话,在服务器中随机生成一个唯一的SESSION_ID,这个SESSION_ID在本次登录结束之前在页面中一直有效。当关闭页面或者执行注销操作后,该SESSION_ID会在服务器中自动注销。当重新登录此页面时,会再次生成一个随机且唯一的SESSION_ID。
1.创建会话:4个步骤
(1)启动会话
启动PHP会话有两种方式:
- 通过session_start()函数创建会话。
//在使用session_start()函数之前浏览器不能有任何输出,否则会产生错误。即使在PHP脚本之外存在空格也不可以。bool session_start(void)
- 通过session_register()函数为会话登录一个变量来隐含地启动会话。
//name用于指定新session变量的名称。使用session_register()函数,要求将php.ini文件中的register_globals选项值设置为On。在PHP5.3.0或者更高版本中不要使用session_register()函数来启动会话,会出现错误。boolean session_register(string name)
- PHP会话的启动,推荐应用session_start()。
(2)注册会话
会话变量被启动后,全部保存在数组$_SESSION中。通过数组$_SESSION创建一个会话变量很容易,只要直接给该数组添加一个元素即可。
(3)使用会话
例如,判断页面中是否存在会话ID,如果不存在,就创建一个,并且使其能够通过全局数组$_SESSION进行访问;如果已存在,则将这个已注册的会话变量载入以供用户使用。代码如下:
<?php
session_start();
if(isset(session_id())){
echo $_SESSION['mr'];
}else{
$_SESSION['mr']="mrsoft";
}
?>
(4)删除会话
有3种方式,即删除单个会话、删除多个会话、结束当前会话。
- 删除单个会话:同删除数组中的指定元素相同,都可以通过unset()函数完成。 unset($_SESSION['user']); 如果通过unset()函数一次注销整个数组( unset($_SESSION) ),那么会禁止整个会话功能,而且没有办法将其恢复,用户也不能再注册$_SESSION变量。
- 删除多个会话:如果要一次注销所有的会话变量,可以将一个空的数组赋值给$_SESSION。代码如下:
$_SESSION = array();
该函数清空会话中的所有资源,彻底销毁SESSION。</pre></li><li>结束当前会话:如果整个会话已结束,那么就可以使用session_destroy()函数结束当前的会话。<pre class="html" name="code">session_destroy();
2、配置PHP的会话
在论坛中经常会看到对用户登录时间进行设置的复选框,该功能将您本次登录使用的用户名和密码保存在本机中,具体保存时间由用户自己选择,如保存一个星期、一个月等。
(1)在客户端支持Cookie的前提下,控制SESSION的生命周期
setCookie()函数
在PHP中,setCookie()函数的主要职责是创建Cookie。但是,该函数同样可以控制SESSION的过期时间。实例如下:
<?php
session_start();
$time=1*60; //设置SESSION过期时间
setCookie(session_name(),session_id(),time()+$time,"/"); //设置SESSION过期时间
$_SESSION[id]="明日科技"; //注册SESSION
?>
(2)在客户端不支持Cookie的前提下,控制SESSION的生命周期
- 在登录之前告知用户必须打开Cookie,最为常用。
- 设置php.ini文件中的session.use_trans_sid=1或者编译时打开-enable-trans-sid选项,让PHP自动跨页面传递SESSION_ID。该方法基本不用。
- 以GET或者POST方式,通过表单元素传递SESSION_ID。
- 通过文件或者数据库传递SESSION_ID。该方法修改SESSION数据的存储位置,可以减轻服务器的压力,特别适合于企业级网站开发使用。
3、SESSION临时文件
session_save_path()函数用来取得或者重新配置当前SESSION的存储路径。
string session_save_path(string path)
//如果不设置path,则直接获取当前SESSION的存储路径。
session_save_path()需在session_start()之前调用。
4、SESSION缓存
将网页中的内容临时存储到客户端IE的Temporary Internet Files文件夹下,并可以设置缓存的时间。
(1)缓存函数:session_cache_limiter
string session_cache_limiter([string cache_limiter])
//cache_limiter设置缓存方式:nocache,private,private nocache,public
(2)缓存时间函数:session_cache_expire
int session_cache_expire([int new_cache_expire])
//cache_expire设置SESSION的过期时间,单位为分钟。默认过期时间是180分钟
session_cache_limiter()和session_cache_expire()必须在session_start()调用之前使用,否则将出错。
注意:虽然通过缓存时间函数设置缓存过期时间,但是在过期之后并不能够删除存储在客户端缓存文件夹中的缓存文件,缓存文件的删除由Windows操作系统自行控制,或者由用户手动删除。
5、SESSION数据库存储
将SESSION_ID存储于数据库中,应用session_set_handler()函数。具体参考手册。