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获取类中常量,属性,及方法列表的方法
Apr 09 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
php5与php7的区别点总结
Oct 11 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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制作静态网站的模板框架(四)
2006/10/09 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
关于query Javascript CSS Selector engine
2013/04/12 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
十一个高级MySql面试题
2014/10/06 面试题
小浪底导游词
2015/02/12 职场文书
实习生辞职信范文
2015/03/02 职场文书
红与黑读书笔记
2015/06/29 职场文书
清明节主题班会
2015/08/14 职场文书
银行求职信范文
2019/05/13 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python