PHP自带Session隐患(session文件独占锁引起阻塞)

PHP默认的会话处理器是session.save_handler = files(即文件)。如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。解决方案如下:

(1)修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁。

//author http://www.lai18.com 

session_start();

$_SESSION['test'] = 'test';
session_write_close();

//do something

(2)利用session_set_save_handler()函数是实现自定义会话处理。

//author http://www.lai18.com
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 类来使用。

//author http://www.lai18.com
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);

转载请注明: http://blog.csdn.net/hello_katty

时间: 2024-08-08 19:09:17

PHP自带Session隐患(session文件独占锁引起阻塞)的相关文章

php学习之并发控制中的独占锁

在php开发中,我们常常遇到并发问题,那对于并发控制中的独占锁问题我们怎么解决呢?一起来看看吧. 1.并发问题 并发大家都知道是什么情况,这里说的是并发多个请求抢占同一个资源,直接上实例吧 请求:index.php?mod=a&action=b&taskid=6 处理: $key = "a_b::".$uid.'_'.$taskid; $v = $redis->get($key); if($v == 1){ $redis->setex($key,10,1);

带进度条的文件上传

Ajax技术——带进度条的文件上传 1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运行本实例,如图1所示,访问文件上传页面,单击“浏览”按钮选择要上传的文件,注意文件不能超过50MB,否则系统将给出错误提示.选择完要上传的文件后,单击“提交”按钮,将会上传文件并显示上传进度. 2.技术要点 主要是应用开源的Common-FileUpload组件来

hibernate 管理 Session(单独使用session,非spring)

Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 委托程序管理 Session 对象的生命周期 在 Hibernate 的配置文件中, hibernate.current_session_context_class 属性用于指定 Session 管理方式, 可选值包括 thread: Session 对象的生命周期与本地线程绑定 jta*: Session 对象

Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication) Apache shiro集群实现 (四)shiro授权(Authentication)--访问控制 Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案 Apache shiro集群实现 (六)分布式集群系统下的高可用session

什么是cookie?什么是session?session和cookie有什么区别?

在技术面试中,经常被问到“说说Cookie和Session的区别”,大家都知道,Session是存储在服务器端的,Cookie是存储在客户端的,然而如果让你更详细地说明,你能说出几点?今天个推君就和大家谈谈“Cookie和Session”的那些事儿. Cookie是什么? 从它的词语本身含义来看: Cookie: n. 饼干:小甜点 N-COUNT A cookie is a piece of computer software which enables a website you have

HttpContext.Current.Session 和 Session 的区别

Session(会话)通常指一个动作从开始到结束不间断的一个动作. 例如“打电话”,通常是“1.拿起电话--2.拨对方号码--3.对方截图--4.挂机”.这四个步骤从完成到结束组成了一个基本的Session,中间任何一步断裂,都会导致Session的失效. 而在浏览器里,Session主要通过连接传递,“打开购物--点击连接选择物品--添加到购物车--结账”组成了一个Session,在不使用Cookie的情况下,中间任何一步断裂都会Session失效. 所有,你用浏览器打开2个页面,在一个页面里

MySQL如何导出带日期格式的文件

一网友问在MySQL中如何只用SQL语句导出带日期格式的文件.觉得有点意思,于是尝试了一下.导出文件使用SELECT INTO OUTFILE 但是OUTFILE后面的值不能使用变量,所以只能使用动态SQL语句来实现.其中表user为测试表.具体语句如下所示 mysql> SET @SqlScript= CONCAT("SELECT * INTO OUTFILE '/tmp/sql_out_", DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'), "

页面中引入带中文的JS文件乱码问题

1. WebConfig: ? 1 <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312"/> 2.<META http-equiv="content-type" content="text/html; charset=gb2312"> 3.<script t

session 之session混乱解决方法(转)

知道了session混乱产生的原因之后,也就知道了问题的根源.同时也引出了很多的问题: 1.如何记录住在线人员(这里只有帐号的系统用户,不包括访客): 2.如何限制同一个帐号在同一时间段内只能够登陆一次系统? 3.如何限制不同的用户在同一台机器上登陆系统? 4.管理员如何踢人? 我们首先来分析上面的问题: 首先在服务器端当用户通过身份验证成功登陆系统之后,我们将此用户的信息记录住(OnLineUserManager.java),包括帐号.登陆日期.机器的IP地址.session的ID,sessi