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你的验证码安全码?
Jan 02 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
php生成二维码
Aug 10 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
PHP遍历目录文件的常用方法小结
Feb 03 PHP
PHP开发的微信现金红包功能示例
Jun 29 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 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 intval的测试代码发现问题
2008/07/27 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
PHP中的替代语法介绍
2015/01/09 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
日期 时间js控件
2009/05/07 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
python使用logging模块发送邮件代码示例
2018/01/18 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
如何用python处理excel表格
2020/06/09 Python
python设置表格边框的具体方法
2020/07/17 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
外企C语言笔试题
2013/11/10 面试题
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
时尚休闲吧创业计划书
2014/01/25 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
给numpy.array增加维度的超简单方法
2021/06/02 Python
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
浅谈redis整数集为什么不能降级
2021/07/25 Redis
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技