PHP自带Session隐患(session文件独占锁引起阻塞)
PHP自带Session隐患(session文件独占锁引起阻塞)
(1)修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁。
- session_start();
- $_SESSION['test'] = 'test';
- session_write_close();
- //do something
(2)利用session_set_save_handler()函数是实现自定义会话处理。
- function open($savePath, $sessionName)
- {
- echo 'open is called';
- return true;
- }
- function close()
- {
- echo 'close is called';
- return true;
- }
- function read($sessionId)
- {
- echo 'read is called';
- return '';
- }
- function write($sessionId, $data)
- {
- echo 'write is called';
- return true;
- }
- function destroy($sessionId)
- {
- echo 'destroy is called';
- return true;
- }
- function gc($lifetime)
- {
- echo 'gc is called';
- return true;
- }
- session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
- register_shutdown_function ( 'session_write_close' );
- session_start();
- $_SESSION['foo'] = "bar";
当然,在 php 5.4.0之后,你可以通过实现 SessionHandlerInterface 接口或继承 SessionHandler 类来使用。
- class MySessionHandler extends SessionHandler {
- public function __construct()
- {
- }
- public function open($save_path, $session_id)
- {
- }
- public function close()
- {
- }
- public function create_sid()
- {
- }
- public function read($id)
- {
- }
- public function write($id, $data)
- {
- }
- public function destroy($id)
- {
- }
- }
- $handler = new MySessionHandler();
- //第2个参数将函数 session_write_close() 注册为 register_shutdown_function() 函数。
- session_set_save_handler($handler, true);
你可以对上面的代码进行具体实现和封装,利用mysql或其它内存数据库来管理会话数据。还能解决使用集群时,session数据共享问题。
参考来源:
PHP自带Session隐患(session文件独占锁引起阻塞)
http://www.lai18.com/content/407206.html
PHP自带Session隐患(session文件独占锁引起阻塞)的更多相关文章
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- Ajax实现带进度条的文件上传
Ajax实现带进度条的文件上传 文件上传页面运行效果 上传文件并显示进度条运行效果 代码如下; DiskFileItemFactory factory = new DiskFileItemFactor ...
- PHP session有效期session.gc_maxlifetime的设置方法
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...
- hibernate 管理 Session(单独使用session,不spring)
Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- org.hibernate.LazyInitializationException...no session or session was closed
org.hibernate.LazyInitializationException:failed to lazily initialize a collection of role:cn.its.oa ...
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- PHP session有效期session.gc_maxlifetime详解
一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的sessio ...
- hibernate 管理 Session(单独使用session,非spring)
Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...
- 什么是cookie?什么是session?session和cookie有什么区别?
在技术面试中,经常被问到“说说Cookie和Session的区别”,大家都知道,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,你能说出几点?今天个推君就和大 ...
随机推荐
- 使用PS过程
1. 设置图层背景色和前景色 设置背景色和前景色方法类似,下面以设置背景色为例说明.方法一:使用色板设置图片背景色第一步:单击"文件"菜单,选择"新建文档",这 ...
- oracle去掉重复记录语句
oracle去掉重复记录语句 比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select p1.* from persons p1 ...
- PHP获取具有相同name的多个input表单信息
首先是表单应该这样写,注意每个 name="name[]"后面是有一个方括号的.这是PHP特有的获取具有相同name的多个input元素value的方法.(复选框也是采用这种方法) ...
- IOS常见错误之一连线错误
在IOS编程中,UI方面,对于新手,接触时,不免喜欢拖控件,觉得省去了一些麻烦,其实在操作控件的过程中也有很多问题需要注意 本人今天就说下遇到的一个问题. setValue:forUndefinedK ...
- php的cookie和session相同主域名共享
如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...
- jQuery的ajax问题
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to th ...
- js打开新页面
var PostNewPage=function (url, params) { var temp_form = document.createElement("form"); t ...
- 主机使用代理上网,虚拟机Linux如何连外网
VMware虚拟机的三种联网方法及原理 一.Brigde--桥接 :默认使用VMnet0 1.原理: Bridge 桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中,同时在& ...
- LeetCode(131)Palindrome Partitioning
题目 Given a string s, partition s such that every substring of the partition is a palindrome. Return ...
- SQL Split
最初是根据数据ID批量删除数据,因为不知道到底是要删除多少条,而T-sql里也没有像C#中params这样方便的东西,所以想到字符串分割,但是发现T-sql中也没有提供字符串分割的函数,所以自己搜索了 ...