如何在不同的页面间共享数据呢?
- 数据库:慢,PHP连接Apache,Apache连接数据库服务器
- 包含文件:较慢,PHP连接Apache,不用二次通讯,在本服务器上读取对应的文件即可,受约于硬盘的转速
- cookie:利用的也是文件,存的时候是数组的形式,拿出来也是可以直接使用的数组
- session:利用的也是文件,存的时候是数组的形式,拿出来也是可以直接使用的数组
- 内存:最快,关机消失,可以从数据库取出常用数据至内存,缓存技术的一种
cookie与session是相互补充的,session运用了部分cookie技术
本文主要讲述cookie和session。先来两个故事~~~
有一天,A去沃尔玛(浏览器),前台美眉(服务器)说必须办会员卡才能购物。于是A提供了姓名、手机号、充值金额,美眉办理出了A三张卡,把信息(cookie数据)录入到卡里,并把卡快递到了A的家里(客户端),并告诉他必须回家带着卡里的信息,下次才能来购物,本次不能消费,而且三张卡的有效期都是一周(cookie的有效期),三张卡互不影响,
于是A回家了。第二天携带着三张卡里的数据(cookie数据)又来了,美眉读取了A带来的数据($_COOKIE
),把数据($_COOKIE
)报给其他每个店铺,A就可以到每家店铺消费。
一周后,家里的卡(客户端数据)失效了,A无法读出卡里的数据,无奈又去万达重新办了卡(重新设置cookie)。
新卡办完第二天,A的三张卡丢了,赶紧去万达挂失,美眉立即帮A把三张卡挂失了(设置cookie过期时间),并重新给A办理了三张临时卡(重新设置cookie,过期时间设置为0,会话后过期),下次来使用的时候一旦出了万达大门(关闭浏览器)就失效了。
B去了万达广场(浏览器),也是必须办会员卡才能购物,同样提供了姓名、手机号、充值金额,
前台美眉(服务器)留下了卡(session文件),只给了B一个卡号(PHPSESSID),
而且告诉B现在就可以购物,去店铺报上卡号(PHPSESSID)就OK了。
于是B兴冲冲的去了屈臣氏,报上了卡号(PHPSESSID),屈臣氏的工作人员检查了卡有没有过期(开启session,过期或不存在就重新办理),然后向前台美眉(服务器)发送了卡号(PHPSESSID),换来了B的信息($_SESSION
)。
第二天,B又来了,说了卡号,但是前台美眉让他重新办卡,说是默认规定每次来购物都要重新办卡,也可以自己设置多久办一次卡(需设置php.ini里的session.cookie_lifetime
和session.gc_maxlifetime),于是B又办了一张卡,但是刚办完,B又不想要这张卡了,去找美眉注销,于是美眉就一通操作(
- 清空内存里的session数组
- 删除客户端的cookie文件
- 删除服务器上的session文件
)
两个故事最大的区别在于:
- 1.卡在不在自己手里(数据是在客户端还是在服务器)
- 2.能不能当场消费(第一次刷新页面能不能获取到数据)
- 3.安全性(对泄露而言 数据在服务器比在客户端要安全一点点)
代码如下:
<?php
// 首次刷新 cookie 本次设置不会生效
// cookie是在header头里传递的,header头必须在正文输出之前发送,所以不允许在cookie前有输出
setcookie('name','user1',time()+3,'/'); #3s后过期
setcookie('age','20',time()+36000,'/');
setcookie('sex','man',time()+36000,'/');
echo "<pre>";
print_r($_COOKIE);
echo "</pre>";
?>
<?php
setcookie('name','user1',time()-1,'/'); #设置立即过期
setcookie('age','20',0,'/'); #会话结束后(关闭浏览器)过期
setcookie('sex','man',0,'/');
echo "<pre>";
print_r($_COOKIE);
echo "</pre>";
?>
<?php
session_start();
$_SESSION['username'] = 'user11';
$_SESSION['userid'] = '1';
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>
<?php
session_start();
// 清空内存里的 session数组
$_SESSION=array();
// 清除客户端
setcookie('PHPSESSID','',time()-1,'/');
// 清除服务器
session_destroy();
?>