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 相关文章推荐
将数组写入txt文件 var_export
Apr 21 PHP
php 数组的指针操作实现代码
Feb 08 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
php中get_headers函数的作用及用法的详细介绍
Apr 27 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 PHP
php数组函数array_walk用法示例
May 26 PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
Feb 08 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解析html的实现代码
2011/08/08 PHP
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
python决策树之CART分类回归树详解
2017/12/20 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python requests证书问题解决
2019/09/05 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python3 读取Word文件方式
2020/02/13 Python
python一些性能分析的技巧
2020/08/30 Python
美国性感女装网站:bebe
2017/03/04 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
教育英语专业毕业生的求职信
2014/03/13 职场文书
安全生产演讲稿
2014/05/09 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
网吧消防安全责任书
2014/07/29 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
python 实现体质指数BMI计算
2021/05/26 Python