简单使用
读写session
Session_start();
$_SESSION["name"] = "value";
echo $_SESSION["name"];
销毁session
session_unset();
session_destroy();
session_is_registered("gender")
读sessionID
<?php
session_start();
echo session_id();
// 输出 dqr58dnuqj2gufvg4o3tmjb9v4
?>
写sessionID
<?php
session_id("NowaMagic");
session_start();
echo session_id();
// 输出 NowaMagic
?>
登录超时的应用
在每一个前端页面与后台交互时,后台均可通过判断session是否超时,来决定用户可进入当前页面还是强制用户重新登录。
- 在ThinkPhp中,如何界面登录超时?步骤如下:
- 通过执行session操作记录login_time;
- 除登录外的所有其他界面对应的Controller均继承BaseController,在BaseController的_initialize()函数中,将执行checkAdminSession()检查是否登录超时,如登录未超时,则把login_time变量赋值为当前时间,并继续刷新当前界面,否则跳到Login界面。
猜测类似Spring等框架将采用类似操作。
Session和Cookie的区别
- Session中同一浏览器同一站点只能有一个session_id,即一个session,cookie同。
- cookie存在客户端,session存在服务端。
- 由于浏览器经常禁用cookie,导致cookie是不可靠的,而session存在服务端,是可靠的。
- 用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。SessionID是保存到客户端的:a. 用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的; b. 如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。 - session由于存储在服务器,会影响系统性能
session在大访问量网站上会影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时,PHP支持 session目录hash,我们可以通过修改php.ini中session.save_path = “2;/path/to/session/dir”,那么session将存储在两级子目录中,每个目录有16个子目录[0~f],不过好像PHP session不支持创建目录,你需要事先把那么些目录创建好 。
还有一个问题就是小文件的效率问题,一般我们的 session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率肯定会很差,PHP手册上建议使用Reiserfs文件系 统,不过Reiserfs的前景堪忧,Reiserfs的作者把媳妇给杀了,SuSE也抛弃了Reiserfs。 - 应用场景
cookie应用场景:
a. 判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
b. 另一个重要的应用是“购物车”中类的处理和设计。用户可能在一段时间内在同一家网站的不同页面选择不同的商品,可以将这些信息都写入cookie,在最后付款时从cookie中提取这些信息,当然这里面有了安全和性能问题需要我们考虑了。
session应用场景:
a. 登录超时判断;
b. 保存购物车信息;
比如在淘宝的产品详情页面,提交了产品尺寸信息到服务器,然后采用session保存该尺寸信息,在用户点击支付时,再将支付信息+产品尺寸信息(从session中读取),统一写到数据库即可。(无需用户在前端每提交一个数据,就保存到数据库一次)
c. 保存验证码信息
参考
php里session的用法(超级经典)
浅谈Session与Cookie的区别与联系
ThinkPHP函数详解:session方法
thinkphp中的session的使用和理解!
PHP通过session id 实现session共享和登录验证