PHP session文件独占锁引起阻塞问题解决方法


Posted in PHP onMay 12, 2015

PHP默认的会话处理器是session.save_handler = files(即文件)。如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。解决方案如下:

(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 相关文章推荐
用Flash图形化数据(二)
Oct 09 PHP
树型结构列出指定目录里所有文件的PHP类
Oct 09 PHP
让你同时上传 1000 个文件 (二)
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
PHP通过串口实现发送短信
Jul 08 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 PHP
搭建自己的PHP MVC框架详解
Aug 16 PHP
php微信公众号开发之秒杀
Oct 20 PHP
PHP获取数组最大值下标的方法
May 12 #PHP
PHP Streams(流)详细介绍及使用
May 12 #PHP
PHP stream_context_create()函数的使用示例
May 12 #PHP
php中使用gd库实现下载网页中所有图片
May 12 #PHP
php中使用gd库实现远程图片下载实例
May 12 #PHP
PHP输入输出流学习笔记
May 12 #PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 #PHP
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
iOS10推送通知开发教程
2016/09/19 PHP
PHP中overload与override的区别
2017/02/13 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
Django日志模块logging的配置详解
2017/02/14 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
浅谈Python中的私有变量
2018/02/28 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
学生手册家长评语
2014/02/10 职场文书
模范家庭事迹材料
2014/02/10 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
竞聘书格式及范文
2014/03/31 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android