COOKIE缓存 && SESSION缓存
什么是COOKIE
cookie是在http协议下,服务器或脚本可以维护客户端信息的一种方式。
cookie是web服务器保存在用户浏览器上的小甜饼(一个很小的文本文件)。
它可以包含有关用户的信息,常用于保存用户名,密码,个性化设置,个人偏好记录等。
当用户访问服务器时,服务器可以设置和访问cookie的信息。
cookie保存在客户端,通常是IE或Firefox浏览器的cookie临时文件夹中,可以手动删除。
Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递。
注意:如果浏览器上cookie 太多,超过了系统所允许的范围,浏览器也会手动对它进行删除。
cookie 工作原理
当客户访问某个基于PHP技术的网站时,在PHP中可以使用setcookie函数生成一个cookie.
系统经处理把这个cookie发送到客户端并保存在C:\Documents and Settings\用户名\Cookies目录下。
cookie是HTTP头的一部分,因此setcookie()函数必须在HTML本身的任何内容送到浏览器之前调用。
这种限制与header函数一样。
当客户再次访问该网站时。
浏览器会自动把C:\Documents and Settings\用户名\Cookies目录下与该站点对应的cookie发送到服务器.
服务器则把从客户端传来的cookie将自动地转化成一个PHP变量。
在PHP5中,客户端发来的cookie将被转换成全局变量。可以通过$_COOKIE['xxx']读取
设置cookie
参数 | 描述 |
---|---|
name | 设置cookie的名字.(必须) |
value | 设置cookie的值 |
expire | 可选。规定 cookie 的过期时间。 |
path | 可选。规定 cookie 的服务器路径 |
domain | 可选。规定 cookie 的域名 |
secure | 可选 |
语法
setcookie(name,value,expire,path,domain,secure)
例
setcookie(“username”, “admin”, time() + 60 * 60);
接收和使用cookie
PHP对cookie有很好的支持,和form表单一样.
在接收的时候PHP会自动从web服务器接收HTTP头并且分析它。接收的时候和表单接收一样
echo $_COOKIE["username"];
删除Cookie
调用只带有name参数的setcookie,那么名为这个cookie将被从客户机上删除;
例:setcookie(“MyCookie”);
设置Cookie的失效时间为time()或time()-1
setcookie("username","admin",time()-1);
time()减多少没有关系,只要是过期时间就行。
那么这个Cookie在这个页面的浏览完之后就被删除了(其实是失效了)。
当这个Cookie被删除时,它的值在当前页仍然有效。
如果要把cookie设置成在浏览器关闭后就失效。那么可以直接把expiretime设为0,或者不设置此值。
setcookie("name","value",0)。
使用Cookie注意事项
setcookie()之前不能有任何html输出,就是空格,空白行都不行。
setcookie()后,在当前页调用echo $_COOKIE[“name”]不会有输出。必须刷新或到下一个页面才可以看到cookie值。
使用cookie的限制。一个浏览器能创建的cookie数量最多为300个,并且每个不能超过4KB,
每个WEB站点能设置的cookie总数不能超过20个。
cookie是保存在客户端的,用户禁用了cookie,你的cookie自然也就没作用啦!
如果在某个页面获取不到cookie的,那需要设置cookie的第四个参数,
例
setcookie("id",$id, time()+36002430 ,'/');
什么是会话控制
为了使得网站可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息.
我们需要一种强有力的解决方案,这样就产生了会话控制。
HTTP是一个无状态的协议,此协议无法来维护两个事务之间的联系。
当一个用户请求一个页面后再请求另外一个页面时,HTTP无法告诉我们这两个请求是来自同一个人。
会话控制思想就是能够在网站中跟踪一个变量,我们可以跟踪变量,就可以做到对用户的支持。
并根据授权和用户身份显示不同内容,不同页面。
什么是SESSION
Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期。
在会话期间, 分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分。
Session会话时,SessionID会分别保存在客户端和服务器端两个位置,
对于客户端使用临时的Cookie保存(Cookie名称为PHPSESSID)或者通过URL字符串传递,
服务器端也以文本文件形式保存在指定的Session目录中。
Session通过ID接受每个访问请求,
从而识别当前用户、跟踪和保持用户具体资料,以及Session变量,
比如session_name等等,这些变量信息保存在服务器端。
SessionID可以作为会话信息保存到数据库中,进行Session持久化,
这样可以跟踪每个用户的登陆次数、在线与否、在线时间等。
使用会话的基本步骤
开始会话 > 注册会话变量 > 使⽤会话变量 > 注销变量并销毁会话
开始会话
session_start() 开始一个会话或者返回已经存在的会话。
说明:这个函数没有参数,且返回值均为true。
如果你使用基于cookie的session,那么在使用session_start()之前浏览器不能有任何输出,
否则会发生以下错误:
Warning: Cannot send session cache limiter - headers already sent
(output started at /var/www/html/test.php:2)
也可以在php.ini中启动session.auto_start=1,
这样就无需每次使用session之前都要调用session_start()。
启用此指令的缺点是无法在会话中存储对象,因为定义要在会话开始之前加载才能重新创建对象。
注册、使用会话变量
PHP5使用$_SESSION[‘xxx’]=xxx 注册SESSION全局变量。和GET,POST,COOKIE的使用方法相似。
session_start();
$_SESSION['username'] = "david";
echo "Your username is ".$_SESSION['username'];
注销会话变量
session_unset()函数清除存储在当前会话中的所有变量,它能有效地将会话重置为创建时的状态。
session_destroy()函数从存储机制中完全删除会话,使当前会话失效。
如何存储session信息
session.save_path = /tmp; 设为文件时, session文件保存的路径
session.use_cookies = 1 ; 是否使用cookies
session.name = PHPSESSID; 在cookie的session的名字
session.auto_start = 0 ; 是否自动启动session
session.cookie_lifetime = 0; 设置会话cookie的有效期,以秒为单位,为0时表示直到浏览器被重启
session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.cache_expire = 180; 设置缓存中的会话文档在 n 分钟后过时
cookie和session的区别
cookie和session都可以暂时保存多个页面中使用的变量。
但是它们有本质的差别:cookie 存放在客户端浏览器中,session保存在服务器上;
它们之间的联系是sessionID一般保存在cookie中,或者放在URL上。
当客户端禁用cookie时,session_id将无法传递, 此时session失效。
不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,
则系统自动把session_id附加到url上传递。windows主机则无此功能