PHP学习笔记之session


Posted in PHP onMay 06, 2018

cookie和session是web开发新手容易搞混的两个概念,弄清楚两者有助于对web交互更好的理解。个人认为session和cookie的区别主要有如下几点:

cookie

信息保存在客户端

具体实现由客户端负责

数据大小和数量一般有限制

数据容易被窃取和篡改

session

数据保存在服务端

具体实现由服务器负责

数据大小和数量原则上无限制

安全性较高,可信度强

狭义的session指的是web会话中的session id以及关联的数据,广义的session指通信双方的交互会话。例如用户登录是一次session交互,在ATM机取钱是一次session交互,等等。

session的细节

session的主要作用是标识一个会话,并保存会话期间的数据。以下是session的一些细节。

存取

PHP通过$_SESSION超全局变量获取和存放session中的所有数据。$_SESSION是一个数组,可以方便的进行赋值和读取,例如:

$name = $_SESSION['NAME'];  // 读取session中的name值
$_SESSION['NAME'] = 'new name';   // 赋新值
unset($_SESSION['NAME']);     // 移除session中的值

过期时间

默认session中的数据有可能在session超时后被移除,这取决于PHP是否及时运行垃圾回收。由于PHP运行垃圾回收的系数是请求数,带来的后果是:1. 低流量的站点超时很久后session数据也未被移除; 2. 大流量站点频繁的进行session垃圾回收; 3. 运行垃圾回收在执行用户请求前,遇到了运行垃圾回收的用户可能会感受到系统延迟。一个更好的解决办法是禁用PHP的默认垃圾回收,以cron任务定时执行session_gc函数。这样既保证session的时效性,也能带来性能和用户体验上的提升。

手动移除session中的数据可以用unset移除单个数据项,或者session_destroy函数暴力删除所有的数据。

存储介质和序列化

session中的数据默认以文件形式保存在磁盘上,session打开时读取文件内容反序列化,然后填充$_SESSION数组。在大流量的站点中,存放session文件的目录下会包含大量小文件,将对文件系统造成沉重的IO负担。

session模块中的handler可以指定数据保存方式,例如存放到数据库中、redis/memcache等介质中。PHP内置的handler包括files(默认),redis和memcache。用户可以通过session_set_save_handler来注册自己的handler。

session中存放的数据可能是字符串等基本类型,也可能是数组、对象等复杂类型。session设置中的serialize_handler用来设置序列化和反序列化的handler,hanlder将数据序列化后,在交给save_handler保存。由序列化可知,resource等类型不能也不应该保存到session中。把一个db的连接句柄保存到session中,然后10分钟后再取出来用,这样的想法应该尽快抛掉。

session设置名称

由于http是无状态协议,客户端请求时需要携带session id才能让服务端区分出session。默认的标识session id的名称是PHPSESSID,可以使用session_name来设置其他的名称。例如为了防止攻击者猜出后端是PHP语言的系统,可以设置session id的名称为JSESSIONID,迷惑攻击者。

session自动开启

目前主流的PHP版本默认都不会自动开启session。例如某个访客就随便看一下页面就离开,如果自动开启session,将进行一系列的初始化操作后将session id发送到客户端,以便下次访问时能识别出用户。对于一次性的访客,或者非系统的登录用户,这些操作只会带来额外的开销。

session不自动开启的劣势是使用session前,要确保session已经打开,否则可能取到空数据。如果重命名了默认的session名称,需要在session_start前调用session_name指示目前使用的session名称。

分布式session

大流量的站点,后端提供服务的往往不止一台PHP服务器。如果用户的多次请求不是落在同一台服务器上,而服务器的session数据不共享,可能导致要求用户重复登录的情况发生。解决这个问题的方案既可在前端请求分发做,也可在后端通过设置分布式共享session来实现。

以文件形式保存session数据的系统中,可以指定某个目录为共享目录,所有服务器的session都保存在该目录下;以redis/memcache/db等方式存放session的系统中,配置连接到同一个session服务器即可做到session共享。以session共享方式搭建的系统,前端负载均衡器可以随意分发请求到任意服务器上。

PHP 相关文章推荐
PHP加速 eAccelerator配置和使用指南
Jun 05 PHP
php explode函数实例代码
Feb 27 PHP
php实例分享之二维数组排序
May 15 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
Oct 10 PHP
PHP5.3新特性小结
Feb 14 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
php 中的closure用法详解
Jun 12 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 PHP
laravel 使用auth编写登录的方法
Sep 30 PHP
PHP7 字符串处理机制修改
Mar 09 PHP
PHP中cookie知识点学习
May 06 #PHP
分析php://output和php://stdout的区别
May 06 #PHP
PHP 布尔值的自增与自减的实现方法
May 03 #PHP
PHPExcel 修改已存在Excel的方法
May 03 #PHP
PHP中PDO事务处理操作示例
May 02 #PHP
PHP简单实现解析xml为数组的方法
May 02 #PHP
PHP实现动态压缩js与css文件的方法
May 02 #PHP
You might like
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
vue权限路由实现的方法示例总结
2018/07/29 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python与R语言的简要对比
2017/11/14 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
财务管理专业推荐信
2013/11/19 职场文书
奥运会口号
2014/06/13 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
电子商务实训报告总结
2014/11/05 职场文书
个人总结怎么写
2015/02/26 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
教研活动主持词
2015/07/03 职场文书
Python一些基本的图像操作和处理总结
2021/06/23 Python
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
Win11软件图标固定到任务栏
2022/04/19 数码科技