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 相关文章推荐
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
php编写一个简单的路由类
Apr 13 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
PHP实现的进度条效果详解
May 03 PHP
Yii框架连接mongodb数据库的代码
Jul 27 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
YII2框架使用控制台命令的方法分析
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+mysql实现用户注册登陆的方法
2015/01/03 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
PHP常用技巧汇总
2016/03/04 PHP
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
详解Python3中的Sequence type的使用
2015/08/01 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
python读取文本中的坐标方法
2018/10/14 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
Django之路由层的实现
2019/09/09 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python实现文法左递归的消除方法
2020/05/22 Python
python中如何进行连乘计算
2020/05/28 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
详解python tkinter 图片插入问题
2020/09/03 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
python如何快速拼接字符串
2020/10/28 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
房地产销售经理岗位职责
2014/01/01 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
信访工作个人总结
2015/03/03 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript