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学习之PHP变量
Oct 09 PHP
PHP模块 Memcached功能多于Memcache
Jun 14 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
php获取twitter最新消息的方法
Apr 14 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
PDO实现学生管理系统
Mar 21 PHP
Yii redis集合的基本使用教程
Jun 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使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
python构建深度神经网络(DNN)
2018/03/10 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python实现动态创建类的方法分析
2019/06/25 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
Python 远程开关机的方法
2020/11/18 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
感恩母亲节活动方案
2014/03/04 职场文书
学校春季防火方案
2014/06/08 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
党校学习党性分析材料
2014/12/19 职场文书
毕业生自荐信范文
2015/03/05 职场文书