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网上调查系统
Oct 09 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
php+mysqli使用面向对象方式查询数据库实例
Jan 29 PHP
php相对当前文件include其它文件的方法
Mar 13 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
CI框架整合smarty步骤详解
May 19 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
Apr 03 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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设计模式 注册表模式
2012/02/05 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
python访问类中docstring注释的实现方法
2015/05/04 Python
python变量不能以数字打头详解
2016/07/06 Python
python放大图片和画方格实现算法
2018/03/30 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
大学生自我鉴定
2013/12/16 职场文书
《尊严》教学反思
2014/02/11 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
Python学习之os包使用教程详解
2022/03/21 Python
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL