Web应用程序有一个很重要的特性就是可以记录用户的状态。例如,在论坛中,当用户登录之后,可以记录用户的登录状态,甚至还能记录当前用户所在的论坛版块。要实现这样的功能通常需要通过某种载体来保存此类信息。而最常使用的存储载体有Session与Cookie两种。本讲就来介绍如何在PHP中使用Session与Cookie。
什么是Session
在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。
具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中可以看到,从其实质上来说,Session实际是一个特定的时间概念。
需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器中建立连接时所处的Sessions是两个不同的Session。
Session所能解决的问题
Session有一个特性:此次连接无法得到上次连接的状态。这样,用户在一个PHP脚本中对一个变量进行了赋值操作,而在另外一个PHP脚本中却无法得到这个变量的值。也就是说,在PHP中无法设置多个脚本都可以使用的全局变量。每个PHP脚本中所定义的变量都是只在这个脚本内有效的局部变量。
Session解决方案就是要提供在PHP脚本中定义全局变量的方法,使得这个全局变量在同一个Session中对于所有的PHP脚本都有效。
Session不仅是一个简单的时间概念,还包括了特定的用户和服务器。因此更详细地讲,在一个Session定义的全局变量的作用范围,是指这个Session所对应的用户所访问的所有PHP。
例如,A用户通过Session定义了一个全局变量$user=“wind”中,而B用户通过Session定义的全局变量$user=“jane”。那么在A用户所访问的PHP脚本中,$user的值就是wind。A、B两个用户之间互不干扰。
启动Session
在使用Session前,首先需要使用函数session_start()来启动该Session。该函数的使用格式如下。
bool session_start()
该函数将初始化Session数据,任何Session的使用都必须首先使用该函数。该函数不需要任何参数。另外虽然该函数返回值是布尔型,但它将总是返回True值。
使用此函数时需要注意:在该函数之前的当前页中不允许有任何的内容输出,也不能出现其他HTML代码,否则将会有出错提示。
注册Session
Session在启动之后,就可以通过函数session_register()来注册Session变量。该函数的语法格式如以下代码所示。
bool session_register(mixed name[, mixed ...] )
该函数将注册一个或多个变量为Session数据。参数name为需要注册的全局变量(Session)的名称。参数也可以为一个数组,这样数组中的每一个元素都将被注册为当前的Session。该函数返回值为布尔型,当参数表中的所有参数都被成功注册,它将返回True,反之则返回False。
在使用该函数之前如果没有调用过session_start()函数,则函数会先去调用session_start()。
需要注意的是,这个函数注册的是变量本身,而不是变量的值。也就是说,在注册了变量之后,每当它的值改变时,都会将新的值写入文件,而不用显式地再次调用session_register来记录变更。
调用Session
在PHP中通常使用_SESSION数组来引用Session变量。例如,名为var的Session可以这样引用:$_SESSION["var"] 。
通过函数session_unregister()可以取消session变量。要注意的是,它只是取消了变量在之后文件中的定义,而它仍然可以在当前文件中持续到文件结尾都有效。
Session变量也可以是object(对象类型),不过当使用object类型的Session变量时要注意的是,在每次开启Session之前,都要包含该对象的定义,不管这个脚本中使用不使用这个对象。
关闭Session
如果Session不再需要使用时,可以通过函数session_destroy()来关闭一个Session。此时该Session必须是已经开启的。该函数的使用格式如以下代码所示。
bool session_destroy()
该函数将关闭所有与当前Session关联的数据。但是该函数并不会注销所有的全局Session以及以Cookie形式存在的Session。如果成功,函数将会返回True;反之则返回False。
另一种使用Session的方法
除了使用函数来注册Session之外,还可以直接给Session变量的方法来使用Session。其使用格式如下所示:
$_SESSION['key']=value;
其中的key为需要进行定义的Session键名,value为对其所赋的值。
使用这种方法注册的Session,在注销时需要使用函数:unset()。在使用unset()时需要注意,只需要把指定变量作为参数即可,如:unset($_SESSION[name])。而不需要把$_SESSION作为参数,因为这样将把所有Session全部注销。
什么是Cookie
Cookie是当用户浏览某网站时,网站存储在客户机器上的一个小文本文件。该文件记录了用户的用户ID、密码、浏览过的网页、停留的时间等信息。当用户再次来到该网站时,网站通过读取Cookie,得知用户的相关信息,就可以做出相应的动作。例如,在页面显示欢迎的标语,或者可以使用用户不用输入ID、密码就直接登录等等。
为了保证安全性,Cookie中的大多数内容都经过了加密处理。因此,对于普通用户来说,Cookie仅仅是一些没有实际意义的字母与数字的组合。但这并不表示Cookie是绝对安全的,一些别有用心的人可以通过特殊的方法获取Cookie文件,并解析出其中的内容。所以从这个方面来说Cookie并不是绝对的安全。
Cookie与Session的区别与联系
Session与Cookie的共同点为:二者都同为会话处理机制,都可以用来存私密的东西,也同样也都有有效期的概念。
Cookie数据存放在客户端,Session数据放在服务器上。
Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗。而Session由于保存在远程服务器上,相对比较安全。
由于Session会在一定时间内保存在服务器上。当服务器的访问增多时,会占用服务器的性能。考虑到减轻服务器性能方面,应当使用Cookie。
单个Cookie在客户端的限制是3K,就是说一个站点在客户端存放的Cookie不能超过3K。而Session则没有这方面的限制。
Cookie的使用与浏览器的设置有关,如果用户禁用了Cookie则所有基于Cookie的应用都将失败。而Session则与客户端的配置无关,所以不必关心客户端的配置情况。
注册Cookie
在PHP中要把某个变量注册为Cookie,只需要通过调用函数:setcookie()即可实现。该函数的使用格式如下代码所示:
bool setcookie(string name[,string value[,int expire[,string,path[,string domain[,bool secure[,bool httponly]]]]]])
该函数将定义一个Cookie全局变量并伴随HTTP头信息一起发送。在使用此函数时需要特别注意:该函数前不能有任何的输出内容,包括HTML标记。函数将会返回一个布尔值,如果成功发送则返回True,反之则返回False。
函数setcookie()的各参数及其意义如下表所示:
引用Cookie
注册Cookie后,就可以引用所注册的Cookie。
PHP中有一个自动全局变量$_COOKIE。该变量为用户已经注册的Cookie数组。而调用相关的Cookie值就是调用该数组元素。
具体操作如下:如果已经定义了一个名为:user的Cookie值。则在调用时就使用$_COOKIE["user"]这样的形式即可。
为Cookie设定生命期
通常的Cookie都有生命期即存在时间。一过生命期,Cookie就会被自动删除。当然用户也可以手动删除Cookie直接结束Cookie的生命期。例如,在论坛登录系统中,经常需要设定用户的登录有效期。
前面介绍setcookie()函数时提到函数的第三个参数:expire。该参数即是为Cookie设定的过期时间,以秒作为计量单位。比如在使用setcookie()时当把该参数设为:3600,则所注册的Cookie将后在注册一小时后失效。如果省略该参数,则Cookie只在浏览器打开时有效,一旦关闭浏览器窗口,所设置的Cookie就会失效。另外,把expire设置为过去的时间,如time()-1,则Cookie也会在浏览器关闭时失效。