您的位置:首页 > 编程语言 > PHP开发

关于php session锁的机制的个人理解

2017-06-04 15:57 435 查看
作为一个phper,编程的时候经常会用到session和cookie,之前一直对session的理解比较片面,闲来无事,抽了点时间来稍微深入的理解一下它的运行原理和一些可能会在实际运用中会遇到的问题。

假设第一个用户在登录页面login.php 填写了自己的用户名,(只为演示,忽略掉密码)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SESSION登录测试</title>
</head>
<body>
<form action="do.php?type=login" method="post">
<input type="text" name="username" />
<input type="submit">
</form>
</body>
</html>


提交到后台do.php做登录处理,

一般情况下,程序处理登录请求会很快,但是在高并发和服务器高负载的情况下,速度会有所减慢,我们用sleep函数来模拟程序处理的缓慢情况,设置为10秒

<?php
session_start();

if($_GET['type'] == 'login'){
$username = $_POST['username'];

$_SESSION['username'] = $username;

sleep(10);
}
?>


与此同时,第二个用户也在登录页面提交了用户名,后台接收用户名做session,这次为了避开sleep函数,用另一个分支来处理,

if($_GET['type'] == 'login2'){
$username = $_POST['username'];

$_SESSION['username'] = $username;
}


第二个用户的浏览器一直停留在转圈圈的等待状态,10秒过后,等第一个用户登录请求处理完毕,第二个用户才处理了登录请求,这个就是,我们常说的,session阻塞机制,

session默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定。如果这个用户点击链接,又访问一个该站session_start网页。这是,由于session_id一样,这个页面也有读取锁定该用户存放session文件。 由于,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。

这样一个看似小的问题,实际上,如果网站上面有大量用户访问,会导致session读取文件一直阻塞等待着。用户浏览器一直跟服务器保持连接,会消耗很多服务器资源。web服务器活跃连接数也会增大,可能很快就会耗费完连接资源,出现拒绝服务器。百度了下,其实php里面的session_commit 函数就能帮助我们解决这个问题。我们看下下面代码执行过程:

<?php
session_start();

if($_GET['type'] == 'login'){
$username = $_POST['username'];

$_SESSION['username'] = $username;

session_commit();

sleep(10);
echo $_SESSION['username'];
}
?>


生成session后 ,直接调用session_commit函数,相当于操作完session文件后直接提交关闭session,文件锁打开,后面的用户使用session不再被阻塞,问题解决。

总结:

1.有对session进行写入页面,建议修改完$_SESSION后,随手直接调用session_commit()

2.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非中间执行很耗时的业务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  session php