问题的解决方案
学了这一章,好像并没有真的理解会话处理到底是怎么处理的。
问题的提出:超文本传输协议HTTP是一个种无状态协议,也就是每次请求都是独立的,和之前或之后的请求无关。这就意味着如果后续处理需要前面的信息,就必须重传数据,这样可能大致每次连接传送的数据量增大。
cookies
cookies指存储在用户本地的少量数据,最经典的应用就是记录登录用户名和密码,这样下次访问时就不需要输入自己的用户名和密码了。
cookies存在如下缺陷:1、数据大小是有限制的,大多数浏览器只支持最大为4096字节的cookies,有时不能满,足需求。2、客户端可以禁用或清空cookies,从而影响程序的功能。3、当多人公用一台计算机时使用cookies可能会泄露用户隐私,带来安全问题。
Session
session(会话)可以保持网站服务器和网站访问者的交流,访问者可以将数据保存在网站服务器中。为了区分不同的访问者,网站服务器为每个网站访问者都分配一个会话编号SID,一个访问者在session中保存的所有数据都与他的SID相关联。在访问者打开的所有页面中,都可以通过SID设置和获取Session数据,因此通过Session可以实现多个页面间的数据共享。用户在任意一个页面登录后,都可以将登录标记和登录用户名保存在Session变量中。这样在其他页面就可以获知用户已经登录了,从而避免重复登陆。
Cookies的应用
工作原理
cookies是web服务器存放在用户硬盘上的一段文本,其中存储着一些“键-值"对。每个web站点都可以在用户的机器上存放cookies,并在需要的的时候重新获取cookies。通常Web站点都有一个Cookies文件。
用户每次访问站点A之前都会查找站点A的Cookies文件,如果存在,则从中读取用户名和密码“键-值”对数据。如果找到用户名和密码“键-值”对数据,则将其与访问请求一起发送到站点A.站点A在收到访问请求时如果也收到了用户名和密码“键-值”,则使用用户名和密码数据登录,这样用户就不需要输入用户名和密码了。如果没有收到用户名和密码“键-值”对数据,则说明该用户之前没有成功登录过,此时站点A返回登录页面给用户。
另外,每个Cookies都有一个有效期,过了有效期的Cookies就不能再使用了。
设置Cookies数据
可以使用setcookie()函数设置cookie数据,语法如下:
bool setcookie( string $ name [, string $value [, int $expire=0 [,string $path [, string $domain [, bool $secure= false [,bool $httponly =false ] ] ] ] ] ] )
参数说明:
name:cookies的名字
value:cookies的值
expire:cookies的有效期,单位为秒。
path:cookie的服务器路径,此目录下的网页都能访问该cookies
domain:cookies的域名,此域名下的网页都能访问该cookie.
secure:规定是否通过安全的HTTPS连接来传输cookies
httponly:如果设置为TRUE,则只能通过HTTP访问Cookies,不能使用脚本语言(如js访问cookies);如果设置为false,则没有此限制
如果设置cookies数据成功,则函数返回true,否则返回false.
setcookie()函数必须在< html >之前才能正常工作
在PHP中可以使用$_COOKIE数组读取cookie数据,方法如下:
Cookie值= $ _COOKIE[cookie 名]
也可以直接使用print_r()函数打印 $ _COOKIE数组的内容。
读取和删除cookies数据
<?php
//编写脚本用于记录用户访问当前网页的次数
if(isset($_COOKIE["num"]))
$num=$_COOKIE["num"];
else
$num=0;
$num=$num+1;
//发送一个简单的cookies
setcookie("num",$num,time()+60*4) ;//记录这个cookies时间的60秒*2
setcookie("num",$num,time()-3600);//删除cookies就是将时间设置文件过去的时间
?>
<html>
<body>
<?php
if($num>1)
echo("您已经是第".$num."访问本站点了");
else
echo("欢迎您首次访问本站");
?>
<BR><BR>下面是网页正文<BR>
</body>
</html>
在用户身份验证时使用cookie
Session的应用
工作原理:
session数据保存在服务器上。在会话存续期间,Web服务器上的各页面都可以或许session数据,从而了解与客户端沟通的历史记录,避免用户在浏览不同页面时重复输入数据。
Web站点会给它的每一个访问者分配个会话ID(SID),用户第一次访问Web站点时会得到Web服务器分配的ID,以后每次浏览器提交请求都会带上这个会话ID,所有session数据都与会话ID相关联。
session数据也有一个有效期,一旦超过规定的有效期,没有客户端请求,这个session数据就会清除。
开始会话
bool session_start()函数开始会话。
如果成功开始了会话,则函数返回True;否则返回False.
session_start()函数会为该会话随机生成一个SessionID。可以使用session_id()函数获取或设置SessionID.语法如下:
string session_id([string $id])
如果使用参数,则将其设置为SessionID,否则直接返回当前的SessionID. SessionID用于标识一个Session。
处理SessionID, session还有一个名字,可以使用session_name()函数获取或设置Session的名字。
string session_name([string $name])
如果使用参数,则将其名字设置为Session的名字,否则直接返回当前的Session名。
全局数据$ _SESSION
可以使用全局数组$_SESSION 设置和获取Session数据。它的用法与普通数组相同,只是数组由系统定义,可以在程序的任何位置访问它。在访问数组前,调用session_start()函数开始会话。
例子:
<?php
date_default_timezone_set("Asia/Chongqing");//系统时差8小时问题
//上面这个函数是设置时区的
session_start();
if($_SESSION["last_visit"])
{
echo "您上次访问的时间:";
echo date("Y-m-d,H:i:s",$_SESSION["last_visit"]);
echo "<br/>";
echo "访问次数:".$_SESSION["num_visits"];
}
else
echo "这是您第1次访问";
$_SESSION["last_visit"]=time();
$_SESSION["num_visits"]++;
在不关闭浏览器的情况下可以记录上一次的访问时间和访问次数,一旦关闭浏览器,记录就消失了。
date()函数,$format 有很多指定的字符串返回格式。
string date(string $format [, int $timestamp])
删除会话变量
对于不需要保存的会话变量,可以用函数unset()删除。
void unset(mixed $var [,mixed $var [, $ …] ])
unset()函数可以同时释放多个变量。
unset()函数也可以删除普通变量`
$str="dfaf";
$a=10;
unset($str,$a);
unset()函数释放会话变量
销毁会话
-
session_unset()函数释放所有的session变量,但不删除session文件以及不释放SesssionID,语法如下:
void session_unset()
-
session_destroy()函数
删除当前用户对应的session以及释放sessionid,内存中的$ _SESSION变量内容依然保存。语法如下:
bool session_destroy()
配置session
(感觉一段时间内我是用不了这里面的功能的,还不怎么明白)