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编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
php实现映射操作实例详解
Oct 02 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
Laravel框架自定义分页样式操作示例
Jan 26 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 什么是PEAR?(第三篇)
2009/03/19 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
遍历jquery对象的代码分享
2011/11/02 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
python3大文件解压和基本操作
2017/12/15 Python
使用TensorFlow实现SVM
2018/09/06 Python
python将txt文件读取为字典的示例
2018/12/22 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
感恩节活动方案
2014/01/27 职场文书
驾驶员岗位职责
2014/01/29 职场文书
销售人员求职信
2014/07/22 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python