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文件的实现方法
Mar 19 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
php源代码安装常见错误与解决办法分享
May 28 PHP
定义php常量的详解
Jun 09 PHP
非常实用的php弹出错误警告函数扩展性强
Jan 17 PHP
php数组中包含中文的排序方法
Jun 03 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 PHP
tp5.1 框架查询表达式用法详解
May 25 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
Python通过poll实现异步IO的方法
2015/06/04 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
django rest framework使用django-filter用法
2020/07/15 Python
销售人员个人求职信
2013/09/26 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
母亲节感恩寄语
2014/02/21 职场文书
供货协议书范本
2014/04/22 职场文书
大学生新学期计划书
2014/04/28 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
爱情保证书
2015/01/17 职场文书
城南旧事观后感
2015/06/11 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL