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 相关文章推荐
分页显示Oracle数据库记录的类之二
Oct 09 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
mysql 性能的检查和优化方法
Jun 21 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
php文件类型MIME对照表(比较全)
Oct 07 PHP
php封装json通信接口详解及实例
Mar 07 PHP
自制PHP框架之模型与数据库
May 07 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
JavaScript延迟加载
2021/03/09 Javascript
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python第三方库学习笔记
2020/02/07 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
电子信息工程专业自荐书
2014/06/24 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2014年绿化工作总结
2014/12/09 职场文书
2015年招生工作总结
2015/05/04 职场文书
对象析构函数__del__在Python中何时使用
2022/03/22 Python
Python中re模块的元字符使用小结
2022/04/07 Python
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript