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自动加载的两种实现方法
Jun 21 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
php取整函数ceil,floo,round的用法及介绍
Aug 31 PHP
PHP CURL获取返回值的方法
May 04 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
Aug 12 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
php 多个变量指向同一个引用($b = &$a)用法分析
Nov 13 PHP
PHP 对象接口简单实现方法示例
Apr 13 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实现的下载css文件中的图片的代码
2010/02/08 PHP
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
在Python中使用第三方模块的教程
2015/04/27 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
numpy中索引和切片详解
2017/12/15 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python多线程http压力测试脚本
2019/06/25 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python接口自动化框架实战
2020/12/23 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
Java语言的优势
2015/01/10 面试题
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
大学生优秀的自我评价分享
2013/10/22 职场文书
环保口号大全
2014/06/12 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
党支部综合考察意见
2015/06/01 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
mysql函数全面总结
2021/11/11 MySQL