Session与PHP不得不说的那点事

前几天去奔波面试,投的都是 PHP开发实习,大一下还是大二上自学PHP,这样算来也自学了两年之久;平时做点小项目或者其他兴趣之类的也都用PHP,CI框架也挺熟练,至少源码读过一大部分(当初为了给一个项目挂马来着)。所以自以为水平不说不错至少找得到一个实习吧。结果呵呵,虽没有惨不忍睹也是相当不尽如人意(在这里就不想吐槽拉勾网了)。

话不多说,Session大家都用,新手呢一般就是session_start()然后开始赋值啊检查啊之类。一位面试官问我,Session和Cookies的区别,这个很简单,了解过web基础的都应该清楚,一个服务器端一个浏览器端嘛,然后就是安全啊服务器压力之类;之后他又问我默认时间,这个我还真没注意过。后来又聊了点别的,总之后来就是被刷掉咯,通知我说我基础不够扎实。

现在在实习的公司比较清闲(我也不想清闲,可就是闲的不行不行),我又深入了解了一下PHP的Session机制,才发现,原来一切都没我们想的那么简单.....

我们都知道Session的存在意义就是为了让服务器端知道无状态的HTTP请求都是谁的,Session存储方式一般都是通过Cookies存储一个PHPSESSID在浏览器;有些情况可能会附加在URL上,我们暂不考虑。

那么第一个问题来了:

Session究竟存储多久?

Session的时间可以通过session.gc_maxlifetime 设置,默认1440秒,24分钟;但是官方手册又说了:

session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。 垃圾搜集可能会在 session 启动的时候开始( 取决于session.gc_probability 和 session.gc_divisor)。

session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。session.gc_probability默认为 1,session.gc_divisor 默认为 100;此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。

对的,坑就这在里,24分钟之后也不一定会清理,就算gc启动了也只有1%的概率被清除;也许你会想,把概率调整为100%,但是我没有测试过100%的情况下gc频繁启动遍历各种文件会不会对速度有较大影响。我不禁想起了面试官问这个问题时候狡黠的笑容。

之后又在官网的Note上看到如下:

无论是通过调用函数 session_start() 手动开启会话, 还是使用配置项 session.auto_start 自动开启会话, 对于基于文件的会话数据保存(PHP 的默认行为)而言, 在会话开始的时候都会给会话数据文件加锁, 直到 PHP 脚本执行完毕或者显式调用 session_write_close() 来保存会话数据。 在此期间,其他脚本不可以访问同一个会话数据文件。

也就说对于同一个用户的同时我只能第一个session进行操作,如果我网站大量用到Ajax这样的请求,那么肯定会造成阻塞。官网的Note建议如下:

对于大量使用 Ajax 或者并发请求的网站而言,这可能是一个严重的问题。 解决这个问题最简单的做法是如果修改了会话中的变量, 那么应该尽快调用 session_write_close() 来保存会话数据并释放文件锁。 还有一种选择就是使用支持并发操作的会话保存管理器来替代文件会话保存管理器。

但是我调用session_write_close()是不是又要调用session_start(),是不是很麻烦。

所以,放弃PHP 自带的内置文件会话保存管理器吧。

那用什么存储和管理Session?

我目前在二次开发的CMDB是用的MySql,就麻烦在了不断检查时间然后删除。每一个逻辑背后都要检查一遍,非常 麻烦,我第一个想到的是memcached,毕竟设定时间就好了,应该非常方便。结果看到了这篇文章:

为什么不能用memcached存储Session

于是就有了:

如何使用 Redis 作为 PHP Session handler

还看到了:鸟哥的如何设置一个严格30分钟过期的Session;要么用第三方的存储方式存储;要么设置Cookie过期时间Session的过期时间,并且自己加个时间戳,每次访问都做判断。

最后,本人博客移到本人个人域名的博客下http://www.ebwill.com

时间: 2024-10-11 12:48:22

Session与PHP不得不说的那点事的相关文章

Session 知识点再整理(一)基本概念和原理

Session 的概念 Session 和 Cookie 一样,也是针对 HTTP 的局限性而提出的一种保持客户端和服务器端会话连接状态的机制. Session 被称为会话,指用户在进入网站到浏览器关闭(或退出网站)这段时间内与 Web 系统的会话过程. Session 的存储  Session 保存在服务器端,默认情况以文件的形式保存在服务器硬盘上,每个 Session 一个文件,文件名如:sess_j64kv3np0ft2u00aun0cilqdo2,里面保存的内容结构是:变量名 | 类型:

勿忘经典和与时俱进

每当快到年终的时候,很多朋友开始感慨时间过得好快,感觉今年很多事情还没开始好好大干一番,就要写年终总结了.也许我们在定制计划的时候严格把"年"作为分割点本身就是有问题的,客观的存在不以任何主观意念为转移,其实很早的时候我们就该懂得. 今天刚好是伟大的领袖毛主席123周年的诞辰,曾到首都拜访过纪念馆,一代伟人虽然与世长辞已久,但是留下的著作和诗词还是经常被有理想.有抱负的后人所学习.我想对于一个我们没有接触过得伟人,也只能从留下来的著作中窥探其精神之一二,对于经典的指导思想和战略,我想我

http协议无状态中的 "状态" 到底指的是什么?!

引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解:无状态的[状态]到底指的是什么?! 找了很多资料不仅没有发现有一针见血正面回答这个问题的,而且有些解释还充斥了各种错误,看着看着就觉得心里憋着一股浊气吐不出来 于是在看了很多资料之后,我一口吐出浊气,大声正面提出这个问题:http协议无状态中的[状态]到底指的是什么?! 然后开始不断探索解决这个问题... 最终很高兴的是我找到了让人满意的答案,先卖个关子,各位如果着急可以直接拉到最下查看

Atitit.获取验证码图片通过web

1. WebRequest进行较为底层的访问(不推荐) 1 2. WebBrowser截图 1 3. 剪贴板复制法Clipboard(推荐) 1 4. C# 取WebBrowser中图片 可用于获取验证码 1 1. WebRequest进行较为底层的访问(不推荐) WebBrowser,始终使用WebRequest进行较为底层的访问 2. WebBrowser截图 最近和一位朋友探讨获取WebBrowser访问的网页中验证图片的方法,起先想到的就是通过WebClient直接去下载当前页面中引用的

管理经验(一)——怎样当好一个管理者

有过了带领几次团队的基础后,不知不觉中已经为自己积累了一些管理的经验,而项管考试的准备也在如火如荼的进行着.在这个过程中也不得不让自己很多其它的去思考.怎样才干当好一个管理者? 首先说管理上是没有什么绝对的内容的.就像在做选择题一样,描写叙述太过绝对的选项十之八九就是错误的.因材施教.因地制宜.详细情况详细分析也算是对一个管理者巨大的考验了吧.在准备信息系统项目管理师考试的过程中也是项目管理方面一个比較系统的学习了.当中包含总体.范围.进度.成本.质量.沟通.人力资源.风险.採购9大管理44个过

Java安全——安全管理器、访问控制器和类装载器

摘要: 标签: Java 安全 [toc] 安全管理器:SecurityManager 安全管理器在Java语言中的作用就是检查操作是否有权限执行.是Java沙箱的基础组件.我们一般所说的打开沙箱,也是加-Djava.security.manager选项. 其实日常的很多API都涉及到安全管理器,它的工作... 标签: Java 安全 [toc] 安全管理器:SecurityManager 安全管理器在Java语言中的作用就是检查操作是否有权限执行.是Java沙箱的基础组件.我们一般所说的打开沙

谈谈分工

昨天,我看到一个新闻——雅虎取消了QA团队,工程师必须自己负责代码质量,并使用持续集成代替QA. 同时,也听到网友说,“听微软做数据库运维的工程师介绍,他们也是把运维工程师和测试工程师取消了,由开发全部完成.每个人都是全栈工程师”.于是,我顺势引用了几年前写过一篇文章<我们需要专职的QA吗?>,并且又鼓吹了一下全栈.当然,一如既往的得到了一些的争议和嘲弄;-). 有人认为取消QA基本上是公司没钱的象征,这个观点根本不值一驳,属于井底之蛙.有人认为,社会分工是大前提,并批评我说怎么不说把所有的事

ios学习笔记——NSURLSession

Session中任务的行为取决于三件事:session的类型.任务的类型.当任务创建的时候app是否在前台运行. Sessions的类型 我们通过配置NSURLSessionConfiguration的对象类配置NSURLSession.session类型有三种: 1.一般模式:类似于其他下载网址的基础方法,可以使用缓存的Cache.Cookie.鉴权. 2.及时模式:不使用Cache.Cookie.鉴权. 3.后台模式:在后台完成上传下载,创建Configuration对象的时候需要给一个NS

基于 Laravel (5.1) & Ember.js (1.13.0) 的用户授权系统

Laravel 本身提供了完整的用户授权解决方案,对于由 PHP 驱动的多页面应用,Laravel 能够完美解决用户授权问题.但是在 SPA 中,laravel 退化成一个 API server,页面路由和表单提交完全由前端框架控制,此时面临2个问题: 如何在前端实现页面访问权限控制? 如何对 ajax 请求做授权? 如何在前端实现页面访问权限控制? Ember.js 1.13.0 没有提供 authentication 功能,我使用了一个名为 ember-simple-auth 的第三方扩展.