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 Smarty模板生成html文档的方法
Apr 12 PHP
PHP操作xml代码
Jun 17 PHP
php去除重复字的实现代码
Sep 16 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
PHP中foreach()用法汇总
Jul 02 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
smarty简单应用实例
Nov 03 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 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递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
深入研究React中setState源码
2017/11/17 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
python实现简单的学生管理系统
2021/02/22 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
歌颂祖国演讲稿
2014/05/04 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
电力工程合作意向书
2015/05/11 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android