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文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
php遍历解析xml字符串的方法
May 05 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
PHP+Ajax验证码验证用户登录
Jul 20 PHP
PHP实现移除数组中为空或为某值元素的方法
Jan 07 PHP
yii使用bootstrap分页样式的实例
Jan 17 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
Feb 17 PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 PHP
laravel中的fillable和guarded属性详解
Oct 23 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计算排列组合的方法
2013/11/13 PHP
php中动态修改ini配置
2014/10/14 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
Javascript 继承实现例子
2009/08/12 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
JS数组降维的实现Array.prototype.concat.apply([], arr)
2020/04/28 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python中下划线的使用方法
2015/03/27 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
Python实现一个论文下载器的过程
2021/01/18 Python
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
2014年党员公开承诺践诺书
2014/03/25 职场文书
联片教研活动总结
2014/07/01 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS