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的开发框架的现状和展望
Mar 16 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
详解PHP中的null合并运算符
Dec 30 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
Oct 30 PHP
php面向对象程序设计入门教程
Jun 22 PHP
PHP递归统计系统中代码行数
Sep 19 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
超级简单的php+mysql留言本源码
2009/11/11 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
jquery 插件学习(二)
2012/08/06 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
python正则表达式re模块详解
2014/06/25 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
python ssh 执行shell命令的示例
2020/09/29 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
美国在线家具网站:GDFStudio
2021/03/13 全球购物
经贸日语毕业生自荐信
2013/11/03 职场文书
灰雀教学反思
2014/04/28 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
户外活动总结
2015/02/04 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
centos7安装mysql5.7经验记录
2022/05/02 Servers