PHP SESSION机制,从存储到读取
PHP中,如果要获取SESSION数据,必须要有对应的session_id,session_id的获取方式有两种
1.基于客户端的cookie
2.基于url
先说第一种情况,基于客户端的cookie.服务器端的脚本在开启session后,会依据php.ini来存储session,下面列举一些
session.save_handler 定义存储和获取与会话关联的数据的处理器的名字。默认为 files。如果设定为files(session.save_handler = files),则采用的是php内置机制,如果想自定义存储方式(比如存储到数据库中),则使用session_set_save_handler()进行自定义设置
session.save_path 定义了传递给存储处理器的参数(注释1)。如果选择了默认的 files 文件处理器,则此值是创建文件的路径。默认为 /tmp,也可以修改,比如session.save_path = "e:/wamp/tmp"。也可以使用session_save_path()在脚本中设定(一定在session_start前设定)
举例
假设脚本是session.php
session_save_path(getcwd()."/session_folder");//为方便我已经创建好session_folder这个目录
session_start();
$_SESSION['aa']='bb';
$_SESSION['cc']='dd';
运行完毕,查看session_folder目录

如果一个服务器上有多个项目,那么每个项目设定不同的session_save_path是有必要的,因为PHP会根据session的的垃圾回收机制,来清理默认session目录下的session文件:项目A的php脚本在运行时,极有可能删掉项目B的php脚本生成的session文件.所以,每个项目采用不同的session路径,并在session_start()前,就指定session路径,就互不干扰了.
看这个session文件的名字,其中sess_后面的一大串就是session_id,可以用session_id()设置/读取;
打开这个文件,看一下
aa|s:2:"bb";cc|s:2:"dd";
这是session的序列化处理器序列化的数据,默认值是php(session.serialize_handler = php),
浏览器请求这个文件后,服务器会返回这样的响应头
response header
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Length:0
Content-Type:text/html; charset=utf-8
Date:Fri, 18 Nov 2016 14:55:24 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=100
Pragma:no-cache
Server:Apache/2.4.9 (Win32) PHP/5.5.12
Set-Cookie:PHPSESSID=193tha35k5fj547nbj6o108as3; path=/
X-Powered-By:PHP/5.5.12
黄色部分就是服务器返回的cookie
这个cookie是php生成的,
名:PHPSESSD;
这个PHPSESSID是会话名,是在php.ini中设定:session.name = PHPSESSID,也可以使用session_name()来读取/设定
值:193tha35k5fj547nbj6o108as3;
这个id值就是存储在服务器端的文件的名字啦
路径:/
路径也是php.ini中设定:session.cookie_path = / ,也可以session_set_cookie_params() 设定或session_get_cookie_params()读取.
另外,查看这个cookie的生命周期,偷懒我就直接看浏览器了

可以看到过期时间是关闭浏览器的时候
这个值是php.ini中session.cookie_lifetime设定的(session.cookie_lifetime = 0), 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0。也可用 session_get_cookie_params()读取或session_set_cookie_params() 设定
另外,我再次访问session.php,使用js读取cookie

这么重要的数据,js竟然读取到了,万一被XSS攻击了怎么办,不行,这个cookie不能被js获取,要设定一下
php.ini中,session.cookie_httponly=on,这样js就不会获取到啦
如果用户的浏览器禁用cookie怎么办?
如果禁用了cookie,而php又没有进行额外设置,则php无法读取cookie,也无法获取session值,因为php.ini中默认是这样设定的:
session.use_only_cookies = 1,意思是说,php只能根据cookie中的PHPSESSID的值来存入/获取/修改会话id,这样做是相对安全的,也是php推荐的,因而在此设定值下,如果禁用了cookie,就获取不到session啦
可是,我就是想在禁用cookie的情况下也要设定/读取session值怎么办?php也是允许的,这就是session的第二种获取方式,就是基于URL
php.ini有个选项值:session.use_trans_sid,
设置session.use_trans_sid=on,就可以基于URL来传递会话id,比如我设定session时把session_id()存储在一个隐藏域中,
<input type="hidden" name="<?php echo session_name() ?> value=<?php echo session_id() ?>>
再次访问是,我就可以使用诸如http://php.com/session.php?PHPSESSID=p7iqqncndjmf13si9r6bafg1h1的URL,这样就可以获取session了,但这是很不安全的,极力不推荐.因为url被窃取就完蛋了.
使用这个配置项有个前提,就是session.use_only_cookies = 0
注释1
即session_set_save_handler()中指定的处理器的参数,处理器的一种方法按手册是这样设置
session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid ] ),
其中的第一个方法open(string $savePath, string $sessionName),$savepath就是根据session.save_path的值来获得的
以上绝大部分都是摘自手册,大家可以去看手册,更详细,尤其是会话安全方面,更要注意.
PHP SESSION机制,从存储到读取的更多相关文章
- php中session的生成机制、回收机制和存储机制探究
1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问 ...
- Cookie/Session机制详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
- PHP中的SESSION机制
[转] php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. c ...
- [转]Cookie/Session机制详解
原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用 ...
- 转:理解Cookie和Session机制
原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...
- SESSION机制
一:Session与Cookie Session:在服务器端创建并存放在服务器的内存中的,Session的内容存储是键值对的列表,格式:名称 | 类型:长度:值 Session的生命周期:在php.i ...
- 关于cookie的文章(cookie与session机制)
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- php中session机制的详解
[补充]session_start()要放在php最前面,header()函数也要放在session_start()之后. [读了下面的文章转载的文章后自己的理解]: 1,通过phpinfo()函数可 ...
随机推荐
- 一些关于HTML与CSS的总结与实际应用
//学习前端也快一年了,觉得有必要好好总结一下这一年来学过的知识.一些是前辈们的精华,文章最后会讲地址一一放出,若原作者有任何介意,请及时联系我删除. 关于DOCTYPE 1.DOCTYPE的作用是什 ...
- 20155315庄艺霖--对做中学的理解及对c语言和Java的看法
关于做中学的理解及技能训练的思考 在写这篇博客之前,我首先阅读了娄老师的博客,对做中学的概念很感兴趣.我们常说知识要学以致用,做中学强调的是在用的过程中有新的收获和体会来进一步巩固学习.细数我学过的课 ...
- iOS 面试总结 二
1.用三种方法生成内容为数字 1,2 ,3 的可变数组.(使用Objective-C,尽量一行代码实现) //方法一 NSMutableArray *arr1 = [[NSMutableArray a ...
- 不可变数组NSArray
//数组里面不允许存放基本数据类型,只能存放“对象” NSArray *array = [NSArray arrayWithObjects:@"周星星",@"尹天仇&qu ...
- SEO:避免关键词内部竞争带来的无法收录问题,
站内关键词相互竞争在未经过搜索引擎优化的网站中常出现.许多人不理解搜索引擎对关键词的索引原理,以为在整站内频繁布局某几个热门关键词能提升这些词的排名. 一.搜索引擎希望展现多种多样的搜索结果 搜索引擎 ...
- 吐槽scala
scala可能是唯一一个编译器和IDE对代码有不同理解的语言.当你开始用scala的高级特性的时候,他们的分歧特别的大,以至于现在,intellij上的scala插件已经不敢对可能编译不通过的代码标记 ...
- 谷歌浏览器允许ajax跨域以非安全模式打开
最近使用ajax的时候,因为是在本地测试调用 后台时一直会报错. 解决方案:用谷歌浏览器 以非安全的模式打开 在cmd命令行中 cd 到谷歌的安装目录下 (右键 属性 复制路径) 然后在 运行如下命令 ...
- vector、list、deque三者比较
1.vector是一段连续的内存块,而deque是多个连续的内存块,list是所有数据元素分开保存,可以是任何两个元素都没有连续. 2.vector的查询性能最好,并且的末端增加数据也很好,除非它重新 ...
- jquery 中的框架
DWZ 国产Ajax RIA开源框架 Ninja UI 框架 提供页面插件 angela ui框架 表单布局等 Chico UI 快速页面布局 PrimeUI w2ui 布局 ...
- Dom的继承关系
Document对象: 是Html文档的根节点,拥有其他的节点(element nodes, text nodes, attribute nodes, and comment nodes),并提供了获 ...