PHP中Session可能会引起并发问题


Posted in PHP onJune 26, 2015

在进行Web应用程序开发的时候,人们经常会用Session存储数据。但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题。印度医疗行业软件解决方案提供商Plus91 Technologies高级工程师Kishan Gor在个人博客上对这个问题进行了阐释。

如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请求,而不是并行。这是因为在默认情况下,PHP使用文件存储Session数据。对于每一个新的Session,PHP会创建一个文件,并持续向其中写入数据。所以,每次调用session_start()方法,就会打开Session文件,并取得文件的独占锁。这样,如果服务器脚本正在处理一个请求,而客户端又发送了一个同样需要使用Session的请求,那么后一个请求会阻塞,直至前一个请求处理完成释放了文件上的独占锁。不过,这只限于来自同一个客户端的多个请求,也就是说,来自一个客户端的请求并不会阻塞另一个客户端的请求。

 如果脚本很短,这通常没有问题。但如果脚本运行时间比较长,那就可能会产生问题。在现代Web应用程序开发中,有一个非常常见的情况,就是使用AJAX技术在同一个页面内发送多个请求获取数据。如果这些请求都需要使用Session,那么第一个请求到达服务器后会取得Session锁,其它请求就必须等待,所有请求将串行处理,即使它们彼此之间并没有依赖关系。这将大大增加页面的响应时间。

 有一个方法可以避免这个问题,就是在使用完Session以后立即调用session_write_close()方法关闭Session。这样Session锁就会释放,即使当前脚本还在等在处理。需要注意的是,调用该方法后,当前脚本就不能进一步操作Session了。

需要特别指出的是,本文所陈述的问题和观点只适用于使用session_start()方法的PHP默认Session管理模式。比如,有用户就指出,如果将应用程序托管在AWS EC2上,并正确配置DynamoDB,Session锁定问题就不会出现。

以上就是本文的全部内容了,希望大家能喜欢。

PHP 相关文章推荐
php数据库抽象层 PDO
May 07 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
php curl发送请求实例方法
Aug 01 PHP
关于laravel5.5的定时任务详解(demo)
Oct 23 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 #PHP
PHP获取当前相对于域名目录的方法
Jun 26 #PHP
php通过获取头信息判断图片类型的方法
Jun 26 #PHP
以文件形式缓存php变量的方法
Jun 26 #PHP
PHP批量去除BOM头代码分享
Jun 26 #PHP
PHP多态代码实例
Jun 26 #PHP
PHP微信开发之二维码生成类
Jun 26 #PHP
You might like
社区(php&&mysql)六
2006/10/09 PHP
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
jquery.cookie用法详细解析
2013/12/18 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
js编写简易的计算器
2020/07/29 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python difflib模块示例讲解
2017/09/13 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
基于python log取对数详解
2018/06/08 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
python按比例随机切分数据的实现
2019/07/11 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
一套C++笔试题面试题
2012/06/06 面试题
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
linux系统都有哪些运行级别
2016/03/26 面试题
教育孩子心得体会
2014/01/01 职场文书
年会活动策划方案
2014/01/23 职场文书
农民致富事迹材料
2014/01/23 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
关于母亲节的感言
2014/02/04 职场文书
会计工作决心书
2014/03/11 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书