实习记录9
http://wenwen.soso.com/z/q189568957.htm 实现本地修改网站,服务器上的网站跟着自动更新
Cookie与Session
Cookie和Session是两种不同的存储机制,前者是从一个Web页面到下一个页面的数据传递方法,存储在客户端;后者是让数据在页面中持续有效的方法,存储在服务器端。
1.Cookie管理
1.1 什么是Cookie?
Cookie是一种在客户浏览器存储数据并以此来跟踪和识别用户的机制。(简单地说,Cookie是Web服务器暂时存储在用户硬盘上的一个文本文件,并随后被Web浏览器读取。)当用户再次访问该Web网站时,网站通过读取Cookie文件记录这位访客的特定信息(如上次访问的位置,花费的时间,用户名和密码等),从而迅速作出响应。如在页面中不需要输入用户的ID和密码即可直接登录网站等。
Cookie文本文件的命令格式为:用户名@网站地址[数字].txt
1.2 Cookie的功能
Web服务器可以通过Cookie包含的信息来筛选或维护这些信息,以判断在HTTP传输中的状态。Cookie常用于以下三个方面:
1)记录访客的某些信息。如可以利用Cookie记录用户访问网页的次数,或者记录访客曾经输入过的信息。另外,某些网站可以使用Cookie自动记录访客上次登录的用户名。
2)在页面之间传递变量。浏览器并不会保存当前页面上的任何变量的信息,当页面被关闭时页面上的所有变量信息将随之消失。如果用户声明一个变量id=8,要把这个变量传递到另一个页面,可以把变量id以Cookie形式保存下来,然后在下一页读取该Cookie来获取该变量的值。
3)将所查看的Internet页存储在Cookie临时文件夹中,可以提高以后浏览的速度。
1.3创建Cookie
在PHP中通过setcookie()函数创建Cookie。在创建Cookie之前必须了解的是,Cookie是HTTP头标的组成部分,而头标必须在页面其它内容之前发送,因此它必须最先输出。
使用setcookie创建Cookie,实例代码如下:
<?php
setcookie("TMCookie",$value,time()+3600,"/tm/”,".mrbccd.com",1);//设置有效时间为60秒,有效目录为“/tm/”,有效域名为"mrbccd.com" 及其所有子域名
?>
1.4读取Cookie
在PHP中可以直接通过超级全局数组$_COOKIE[]来读取浏览器端的Cookie值
1.5删除Cookie
1)使用setcookie()函数删除Cookie
代码为:setcookie("name","",time()-1);
在上面的代码中,time()函数返回以秒表示的当前时间戳,把当前时间减1秒就会得到过去的时间,从而删除Cookie.把失效时间设置为0,也可以直接删除Cookie
2)在浏览器中手动删除Cookie
1.6 Cookie的生命周期
如果Cookie不设定失效时间,就表示它的生命周期就为浏览器会话的期间,只要关闭IE浏览器,Cookie就会自动消失。这种Cookie被称为会话Cookie,一般不保存在硬盘上,而是保存在内存中。
如果设置了失效时间,那么浏览器会把Cookie保存到硬盘中,再次打开浏览器时会依然有效,直到它的有效期超时。
2.Session管理
2.1什么是session
session 译为会话,在计算机术语中,session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统所经过的时间。
2.2session工作原理
当启动一个session会话时,会生成一个随机且唯一的session_id,也就是session的文件名,此时session_id存储在服务器的内存中。当关闭页面时此id会自动注销,重新登录此页面,会再次生成一个随机且唯一的id.
2.3 session的功能
session在Web技术中非常重要。由于网页时一种无状态的连接程序,因此无法得知用户的浏览状态。通过session则可记录用户的有关信息,以供用户再次以此身份对Web服务器提交要求时作确认。例如,在电子商务网站中,通过session记录用户登录的信息,以及用户所购买的商品,如果没有session,那么用户每进入一个页面都需要登录一次用户名和密码。
2.4 启动session会话
启动PHP会话有两种方式: 一种是使用session_start()函数,另一种是使用session_register()函数为会话创建一个变量来隐含地启动会话。
1)通过session_start()函数启动会话 ,语法格式为:
bool session_start(void);
2)通过session_register()函数创建会话
session_register()函数用来为会话创建一个变量来隐含地启动会话,但要求设置php.ini文件的选项,即将register_globals指令设置为on,然后重新启动Apache服务器即可。(此时不需要调用session_start()函数,PHP会在创建变量之后隐含地调用session_start()函数)
2.5 注册会话
会话变量创建后,全部保存在$_SESSION中。通过数组$_SESSION创建一个会话变量很容易,只要直接给该数组添加一个元素即可。
例如:启动会话,创建一个session变量并赋空值,代码如下:
<?php
session_start();
$_SESSION["admin"]=null;
?>
2.6 使用会话
首先需要判断会话变量是否有一个会话ID存在,如果不存在,就创建一个,并且使其能够通过全局数组$_SESSION进行访问;如果已经存在,则将这个已创建的会话变量载入以供用户使用;
如,判断存储用户名的session会话变量是否为空,如果不为空,则将该会话变量赋给$myvalue,代码如下:
<?php
if(!empty($_SESSION['session_name']))
$myvalue=$_SESSION['session_name'];
?>
2.7 删除会话
1)删除单个会话
unset($_SESSION['user']); 使用unset()函数时,要注意$_SESSION数组中元素不能省略,即不可以一次注销整个数组,这样会禁止整个会话的功能,如unset($_SESSION)函数会将全局变量$_SESSION销毁,而且没有办法将其恢复,用户也不能再注册$_SESSION变量。
2)删除多个会话
可将一个空的数组赋值给$_SESSION来实现,代码如下:$_SESSION=array();
3)结束当前会话
如果整个会话已经结束,首先应该注销所有的会话变量,然后使用session_destory()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁session,代码如下:
session_destroy();
2.8 session设置时间
1)客户端没有禁止Cookie
使用session_set_cookie_params()设置session的失效时间,此函数是session结合cookie设置失效时间。如要让session在1分钟后失效,实例代码如下:
<?php
$time=1*60;
session_set_cookie_params($time);
session_start();
$_SESSION[username]='mr';
?> (一般不推荐使用此函数,此函数在一些浏览器上会出现问题,所以一般手动设置失效时间)
使用setcookie()函数可对session设置失效时间,代码如下:
<?php
session_start();
$time=1*60;
setcookie(session_name(),session_id(),time()+$time,"/"); session_name是session的名称,session_id是判断客户端用户的标识,因为session_id是随机产生的唯一名称,所以session是相对安全的。失效时间和Cookie的失效时间一样,最后一个参数为可选参数,是放置Cookie的路径。
$_SESSION['user']="mr";
?>
2)客户端禁止Cookie
当客户端禁用Cookie时,Session页面间传递会失效,可以将客户端禁止Cookie想象成一家大型连锁超市,如果在其中一家超市内办理了会员卡,但是超市之间没有联网,那么会员卡就只能在办理的那家使用,解决这个问题的方法有4个。
① 在登录之前提醒用户必须打开Cookie.
② 设置php.ini文件中的session.use_trans_sid=1,或者编译时打开-enable-trans-sid选项,让PHP自动跨页面传递session_id.
③ 通过GET方法,隐藏表单传递session_id,在页面间传递中手动调用。
④ 使用文件或者数据库存储session_id,在页面间传递中手动调用。
2.9 Session 临时文件
使用PHP函数session_save_path()存储session临时文件,可缓解因临时文件的存储导致服务器效率低和站点打开缓慢的问题
<?php
$path='./tmp/';
session_save_path($path);
session_start(); //初始化session
$_SESSION[username]=true;
?>
2.10 session缓存
session 缓存是将网页中的内容临时存储到IE客户端的Temporary Internet Files文件夹下,并且可以设置缓存的时间。当第一次浏览网页后,页面的部分内容在规定的时间内就被临时存储在客户端的临时文件夹中,这样在下次访问这个页面时,就可以直接读取缓存中的内容,从而提高网站的浏览效率。
缓存用的是session_cache_limiter()函数,语法是: string session_cache_limiter([string cache_limiter]) cache_limiter为public或private。同时session缓存并不是指在服务器端而是客户端缓存,在服务器中没有显示。缓存时间的设置,使用的是session_cache_expire() 语法格式为:int session_cache_expire([int new_cache_expire]) 参数new_cache_expire是session缓存的时间,单位为分钟。
2.11session 数据库存储
虽然通过改变session 存储文件夹使session不至于将临时文件夹填满而造成站点瘫痪,但是如果一个大型网站一天登录1000人,一个月登录了30000人,这时站点中存在30000个session文件,要在这30000个文件中查询一个session_id应该不是件轻松的事情,那么这时就可以用session数据库存储,也就是PHP中的session_set_save_handler()函数。
bool session_set_save_handler(string open,string close,string read,string write,string destroy,string gc)
open(save_path,session_name) 找到session存储地址,取出变量名称
close()不需要参数,关闭数据库。
read(key) 读取session键值,key对应session_id
write(key,data) 其中data对应设置的session变量
destroy(key) 注销session对应的session键值
gc(expiry_time) 清除过期session记录