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是存储在客户端的,然而如果让你更详细地说明,你能说出几点?今天个推君就和大 ...
 
随机推荐
- 转:fatal error: SDL/SDL.h: No such file or directory
			
Ubuntu的新得立已经包含SDL库,所以通过几个简单的命令就可以安装,比windows还傻瓜! sudo apt-get install libsdl1.2-dev(比较大,10M左右) 附加包: ...
 - Redis的5种数据结构
			
Redis可以存储可以存储键与5种不同数据结构类型之间的映射. 五种结构类型为:STRING(字符串).LIST(列表).SET(集合).HASH(散列).ZSET(有序集合). 1.字符串类型Str ...
 - 关于MySQL的CRUD操作
			
一.清除mysql表中数据 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也 ...
 - Android开发学习笔记:浅谈显示Intent和隐式Intent
			
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/655132 ...
 - 打造 html5 文件上传组件,实现进度显示及拖拽上传,支持秒传+分片上传+断点续传,兼容IE6+及其它标准浏览器
			
老早就注册了博客园帐号,昨天才发现,连博客都没开,Github也是一样,深觉惭愧,赶紧潜个水压压惊`(*∩_∩*)′ 言归正传.大概许多人都会用到文件上传的功能,上传的库貌似也不少,比如(jQuery ...
 - Caffe入门与应用 by GX
			
深度学习几大工具:Theano(基于python),Torch,Caffe(用c++写的),Tensor flow,CNTK:caffe是比较流行的深度学习的框架 caffe特点:特别适合于新手,由于 ...
 - aa4
			
// 初始化地图 var BMapExt = new BMapExtension(domMain, BMap, require('echarts'), require('zrender')); var ...
 - 如何查看apache,php,mysql的编译参数
			
查看nginx编译参数:/usr/local/nginx/sbin/nginx -V 查看apache编译参数:cat /usr/local/apache2/build/config.nice 查看m ...
 - IOS 开发 ARC兼容MRC框架
			
在后面加 -fno-objc-arc
 - HttpWebResponse远程服务器返回错误: (500) 内部服务器错误。
			
现象 我们编码实现请求一个页面时,请求的代码类似如下代码: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl); req.Us ...