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 相关文章推荐
两种php调用Java对象的方法
Oct 09 PHP
劣质的PHP代码简化
Feb 08 PHP
实现获取http内容的php函数分享
Feb 16 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
Yii框架中memcache用法实例
Dec 03 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
详解php中curl返回false的解决办法
Mar 18 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
图书管理程序(三)
2006/10/09 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
<script defer> defer 是什么意思
2009/05/10 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
js中作用域的实例解析
2017/03/16 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
编程语言Python的发展史
2014/09/26 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
详细分析python3的reduce函数
2017/12/05 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
python+opencv实现车道线检测
2021/02/19 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
网络安全方面的面试题
2015/11/04 面试题
绘画专业自荐信范文
2014/02/23 职场文书
大学开学计划书
2014/04/30 职场文书
产品委托授权书范本
2014/09/16 职场文书
教师党员自我评价范文
2015/03/04 职场文书
甲午风云观后感
2015/06/02 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python