PHP session文件独占锁引起阻塞问题解决方法

 更新时间:2015年05月12日 10:47:30   投稿:junjie   我要评论
这篇文章主要介绍了PHP session文件独占锁引起阻塞,本文讲解PHP使用默认文件会话处理器时容易导致的阻塞问题解决方法,需要的朋友可以参考下

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中cookie和session的区别实例分析

    PHP中cookie和session的区别实例分析

    这篇文章主要介绍了PHP中cookie和session的区别,比较详尽的分析了二者从创建、运用到清除的各个流程的注意事项,需要的朋友可以参考下
    2014-08-08
  • Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解

    Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解

    这篇文章主要介绍了Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法,结合实例形式较为详细的分析了Zend_Helpers动作助手ViewRenderer的功能、使用方法与相关注意事项,需要的朋友可以参考下
    2016-07-07
  • php判断文件夹是否存在不存在则创建

    php判断文件夹是否存在不存在则创建

    这篇文章主要介绍了php判断文件夹是否存在不存在则创建,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04
  • 通过修改Laravel Auth使用salt和password进行认证用户详解

    通过修改Laravel Auth使用salt和password进行认证用户详解

    这篇文章主要给大家介绍了关于通过修改Laravel Auth使用salt和password进行认证用户的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • php使用fullcalendar日历插件详解

    php使用fullcalendar日历插件详解

    这篇文章主要介绍了php使用fullcalendar日历插件的教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Yii清理缓存的方法

    Yii清理缓存的方法

    这篇文章主要介绍了Yii清理缓存的方法,涉及Yii结合jQuery的ajax调用实现清理缓存功能,代码简单实用,需要的朋友可以参考下
    2016-01-01
  • php统计时间和内存使用情况示例分享

    php统计时间和内存使用情况示例分享

    这篇文章主要介绍了php统计时间和内存使用情况示例,大家直接调用下面的方法就可以使用,需要的朋友可以参考下
    2014-03-03
  • yii实现model添加默认值的方法(2种方法)

    yii实现model添加默认值的方法(2种方法)

    这篇文章主要介绍了yii实现model添加默认值的方法,结合实例分析了在rules()方法及在beforeSave()方法中设定两种实现技巧,需要的朋友可以参考下
    2016-01-01
  • 深入解析Laravel5.5中的包自动发现Package Auto Discovery

    深入解析Laravel5.5中的包自动发现Package Auto Discovery

    众所周知Laravel 5.5 发布在即,目前已经确定会增加一个神奇的新特性:Package Auto Discovery。下面这篇文章主要给大家深入的介绍了关于Laravel5.5中包自动发现Package Auto Discovery的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • laravel5 Eloquent 实现事务方式

    laravel5 Eloquent 实现事务方式

    今天小编就为大家分享一篇laravel5 Eloquent 实现事务方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论