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 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
19个Android常用工具类汇总
Dec 30 PHP
PHP上传文件时自动分配路径的方法
Jan 09 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP图片水印类的封装
Jul 06 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
php把文件设置为插件的技巧方法
Feb 03 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 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中文语义分析实现方法示例
2019/09/28 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
护理专业优质毕业生自荐书
2014/01/31 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
学生评语集锦
2015/01/04 职场文书
任命书怎么写
2015/03/02 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS