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中的时间显示
Jan 18 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
php 调试利器debug_print_backtrace()
Jul 23 PHP
php无限遍历目录示例
Feb 21 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
Apr 18 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
laravel Model 执行事务的实现
Oct 10 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面向对象分析设计的61条军规小结
2010/07/17 PHP
php array_walk() 数组函数
2011/07/12 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
PHP的全局错误处理详解
2016/04/25 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
详解PHP用substr函数截取字符串中的某部分
2016/12/03 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
公司中秋节活动方案
2014/02/12 职场文书
在人间读书笔记
2015/06/30 职场文书
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL