写点什么

PHP Session 可能会引起并发问题

  • 2015-01-22
  • 本文字数:894 字

    阅读完需:约 3 分钟

在进行 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 锁定问题就不会出现。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015-01-22 00:516450
用户头像

发布了 1008 篇内容, 共 449.2 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

从外卖员到拼多多30K+程序员,我付出了三年的青春

小Q

Java 学习 程序员 架构 面试

基于Goc的Golang代码VSCode实时染色方案

大卡尔

测试覆盖率 精准测试 Go 语言

业务架构学习内容有哪些?

周金根

BIZBOK 业务架构

Java四种引用类型:强引用、软引用、弱引用、虚引用

简爱W

[翻译]Scalable Go Scheduler Design Doc[Go可扩展调度设计文档]

卓丁

golang scheduler Go scheduler Go 语言

宅家三个月玩转算法,再战字节跳动,字节跳动面试官朝我比了个“ok”

编程 字节跳动 面试 算法

不草率,你只管下载资料,剩下的交给「哇哦」

小Q

Java 学习 架构 面试 分布式

记一种spring框架的想当然但错误的用法

小明同学

源码分析 最佳实践 Spring Framework bug

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(1),出队 - 摊还复杂度 O(1),JavaScript,详细注释

Lee Chen

大前端 LeetCode

澳门金沙玩赢了钱提现不了异常注单未更新有什么办法处理?

丛林里的余光

异常检测 澳门金沙 提现不了

区块链技术发展的十大趋势

CECBC

区块链 金融 安全问题

.NET委托,事件和Lambda表达式

AI代笔

面试必问亿级流量优化策略之JVM调优,文档视频面试,还不收藏

小Q

Java 程序员 架构 JVM jvm调优

从新浪数字化转型,窥见互联网的“懂行”新十年

脑极体

架构师课作业 - 第十三周

Tulane

朱嘉明:全球科技革命正在逼近“奇点”,区块链影响未来人类社会的走向

CECBC

人工智能 科技 科技革命

JavaScript引擎的事件循环机制是怎样工作的?

Walker

Java 大前端 运行时栈帧 事件循环

甲方日常 13

句子

工作 随笔杂谈 日常

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(n), 出队 - O(1),JavaScript,详细注释

Lee Chen

大前端

阿里培训官给新入职程序员的25条建议

Java架构师迁哥

不要以为Bug写的好就是好程序员,其实这只占不到15%

小Q

Java 学习 程序员 架构 面试

架构师训练营第十四周

Melo

一文解开java中字符串编码的小秘密

程序那些事

java安全编码 java编码指南 UTF编码

藏在Java数组的背后,你可能忽略的知识点

Java架构师迁哥

央行数研所推出贸易金融区块链平台

CECBC

区块链 金融

TOGAF认证课由2天变化为5天的思考

周金根

企业架构 TOGAF

oeasy教您玩转linux 010211 牛说 cowsay

o

【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!

冰河

多线程 高并发 秒杀 电商超卖 签约计划第二季

Dubbo-go应用维度注册模型

apache/dubbo-go

dubbo dubbo-go dubbogo

区块链赋能市场监管 浙江上线“黑科技”清除取证固证难题

CECBC

区块链 市场监管 取证难题

一点 Go Web 编程实践经验

Garfield

Go web Go 语言

PHP Session可能会引起并发问题_PHP_谢丽_InfoQ精选文章