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 相关文章推荐
一个目录遍历函数
Oct 09 PHP
PHP 中dirname(_file_)讲解
Mar 18 PHP
php.ini中的php-5.2.0配置指令详解
Mar 27 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
Apr 07 PHP
如何设置mysql允许外网访问
Jun 04 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
PHP精确计算功能示例
Nov 29 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 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实现与ASP Banner组件相似的类
2006/10/09 PHP
php microtime获取浮点的时间戳
2010/02/21 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
python 控制语句
2011/11/03 Python
仅利用30行Python代码来展示X算法
2015/04/01 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
windows下python和pip安装教程
2018/05/25 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
20行python代码实现人脸识别
2019/05/05 Python
python实现四人制扑克牌游戏
2020/04/22 Python
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
诚实守信演讲稿
2014/09/01 职场文书
合作协议书范本
2014/10/25 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript