关于php session锁的机制的个人理解
2017-06-04 15:57
435 查看
作为一个phper,编程的时候经常会用到session和cookie,之前一直对session的理解比较片面,闲来无事,抽了点时间来稍微深入的理解一下它的运行原理和一些可能会在实际运用中会遇到的问题。
假设第一个用户在登录页面login.php 填写了自己的用户名,(只为演示,忽略掉密码)
提交到后台do.php做登录处理,
一般情况下,程序处理登录请求会很快,但是在高并发和服务器高负载的情况下,速度会有所减慢,我们用sleep函数来模拟程序处理的缓慢情况,设置为10秒
与此同时,第二个用户也在登录页面提交了用户名,后台接收用户名做session,这次为了避开sleep函数,用另一个分支来处理,
第二个用户的浏览器一直停留在转圈圈的等待状态,10秒过后,等第一个用户登录请求处理完毕,第二个用户才处理了登录请求,这个就是,我们常说的,session阻塞机制,
session默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定。如果这个用户点击链接,又访问一个该站session_start网页。这是,由于session_id一样,这个页面也有读取锁定该用户存放session文件。 由于,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。
这样一个看似小的问题,实际上,如果网站上面有大量用户访问,会导致session读取文件一直阻塞等待着。用户浏览器一直跟服务器保持连接,会消耗很多服务器资源。web服务器活跃连接数也会增大,可能很快就会耗费完连接资源,出现拒绝服务器。百度了下,其实php里面的session_commit 函数就能帮助我们解决这个问题。我们看下下面代码执行过程:
生成session后 ,直接调用session_commit函数,相当于操作完session文件后直接提交关闭session,文件锁打开,后面的用户使用session不再被阻塞,问题解决。
总结:
1.有对session进行写入页面,建议修改完$_SESSION后,随手直接调用session_commit()
2.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非中间执行很耗时的业务。
假设第一个用户在登录页面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.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非中间执行很耗时的业务。
相关文章推荐
- php中关于会话机制的理解
- 彻底理解PHP的SESSION机制
- 关于php中cookie和session的理解
- 关于php session文件锁机制引发的问题和定位过程
- 【session内部机制】彻底理解PHP的SESSION机制
- 个人猜想的web安全——理解PHP的sessionID的实现
- 关于session实现原理和运行机制的一点理解
- 关于php COOKIE和SESSION的一些理解
- 彻底理解PHP的SESSION机制
- php关于对cookie与session的理解
- 关于CLASSPATH的个人理解
- 关于在php中如何使用session和Cookies
- 关于学好J2SE有啥用的个人理解
- 关于Session_End()运行机制的一些细节!
- [转]关于内存地址的个人理解和操作原理
- 关于php session被保存在数据库中的一个小问题
- 关于Session_End()运行机制的一些细节!
- 关于在php中如何使用session```Cookies~``
- 个人理解session、application、cookie等状态管理的含义
- php中关于session的一个bug