PHP的session文件独占锁引起阻塞的隐患及解决方案

在PHP中,P默认的会话处理器是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自带的隐患,相信官方过一段时间会有很好的解决办法。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 数据
, 函数
, 解决方案
, 时间
destroy
thinkphp session阻塞、session 阻塞、asp.net session 阻塞、php session阻塞、线程阻塞怎么解决,以便于您获取更多的相关知识。

时间: 2024-11-05 21:48:55

PHP的session文件独占锁引起阻塞的隐患及解决方案的相关文章

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

  这篇文章主要介绍了PHP session文件独占锁引起阻塞,本文讲解PHP使用默认文件会话处理器时容易导致的阻塞问题解决方法,需要的朋友可以参考下 PHP默认的会话处理器是session.save_handler = files(即文件).如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能.因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁.

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

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

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);     //处理逻辑省略 } 2.分析 逻辑看来还可以,结果发现数据库中写入了两个同样的

第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测和处理这类问题. 死锁是当两个或者以上的事务互相阻塞引起的.在这种情况下两个事务会无限期地等待对方释放资源以便操作.下面是死锁的示意图: 本文将使用SQLServer Profiler来跟踪死锁.   准备工作: 为了侦测死锁,我们需要先模拟死锁.本例将使用两个不同的会话创建两个事务.   步骤:

第十六章——处理锁、阻塞和死锁(1)——确定长时间运行的事务

原文:第十六章--处理锁.阻塞和死锁(1)--确定长时间运行的事务 前言: 事务是OLTP系统中的主要部分.它管理数据一致性和数据并发问题,当多个资源同时被读取或者修改相同数据时,SQLServer会通过锁定机制来确保数据库中的数据总是处于一个有效状态.在SQLServer中,锁管理器是负责实现这些锁机制.SQLServer对于不同的资源类型提供不同的锁类型,如数据库.文件.对象.表.区.页和键. 当你使用事务时,依然会遇到由事务引起的问题,这些通常是由于锁.阻塞和死锁引起的. 本系列将讲解这三

处理锁、阻塞和死锁(1)——确定长时间运行的事务

前言: 事务是OLTP系统中的主要部分.它管理数据一致性和数据并发问题,当多个资源同时被读取或者修改相同数据时,SQLServer会通过锁定机制来确保数据库中的数据总是处于一个有效状态.在SQLServer中,锁管理器是负责实现这些锁机制.SQLServer对于不同的资源类型提供不同的锁类型,如数据库.文件.对象.表.区.页和键. 当你使用事务时,依然会遇到由事务引起的问题,这些通常是由于锁.阻塞和死锁引起的. 本系列将讲解这三部分的概念. 确定长时间运行的事务: 长时间运行的事务会阻塞其他事务

电脑文件被锁无法删除怎么办?

  1. 借助"猎手" "侦破"被锁由来 安装LockHunter之后,会自动添加右键菜单"What is locking this file?"命令.在日常文件操作过程中,发现某个程序或文件无法复制.更名或删除,可在该文件上单击右键并选择"What is locking this file?"命令(图1);在随后弹出的窗口中,就会给出锁定该文件的程序或进程列表(图2). 图1 图2 小提示: 勾选列表右上角的More det

在win8上装apache学习php的session但是不能更新和删除也找不到session文件位置

问题描述 在win8上装apache学习php的session但是不能更新和删除也找不到session文件位置 5C 在win8上装apache学习php的session但是不能更新和删除也找不到session文件位置,请问这是怎么回事? 解决方案 session在内存中 解决方案二: Session 是 用于保持状态的基于 Web服务器的方法.Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象.

第十六章——处理锁、阻塞和死锁(2)——侦测阻塞和阻塞查询

原文:第十六章--处理锁.阻塞和死锁(2)--侦测阻塞和阻塞查询 前言: 如果一个事务正在等待一些给其他事务锁定的资源.这个事务就被成为"被阻塞的事务".反过来,引起阻塞的事务,也就是锁定资源并造成其他事务等待的事务叫做"正在阻塞的事务". 长时间运行事务会阻塞其他事务和查询,使他们等待长时间.在繁重的系统中,很多时候我们会遇到阻塞问题,如果一个事务因为阻塞未完成.会造成一些列的等待链. 本文将介绍如何发现并马上解决这方面的问题.   准备工作: 本例依旧使用SQL