写点什么

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:516406
用户头像

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

关注

评论

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

开发中遇到跨域我选择这么做

小鑫同学

前端 Node 10月月更

使用PlopJs让开发变得更高效

小鑫同学

前端 Node 10月月更

混合云中合规管理的思考

HummerCloud

云安全 混合云 安全合规检测 10月月更

数据导出Excel实战

卢卡多多

Excel 数据导出 10月月更

Flash软件应用项目(二)

张立梵

设计师 Flash 10月月更

15分钟了解sql注入(一) union注入

贤鱼很忙

网络安全 Web SQL注入 10月月更

上手JavaScript基准测试

小鑫同学

前端 Node 10月月更

开箱体验Rust,Come on!!!

小鑫同学

前端 Node 10月月更

JavaMail 使用POP3/SMTP服务发送QQ邮件

Yeats_Liao

后端 Java core 10月月更

【kafka问题】记一次kafka消费者未接收到消息问题

石臻臻的杂货铺

Kafk 10月月更

10分钟了解sql注入--报错注入(二)

贤鱼很忙

sql 网络安全 10月月更

【分享】前端线上紧急排查工具

小鑫同学

前端 Node 10月月更

算法策略的主动选择,拒绝if...else...(策略模式+简单工厂模式)

小鑫同学

前端 Node 10月月更

从一个工程师成长看自动化运维的过程

阿泽🧸

自动化运维 10月月更

35分钟了解sql注入-盲注(三)

贤鱼很忙

sql 网络安全 10月月更

技术分享必备de终端录制神器

小鑫同学

前端 Node 10月月更

【玩转云函数】打通Github到企微的消息通知

小鑫同学

前端 Node 10月月更

H5加载Android本地路径图片

小鑫同学

前端 Node 10月月更

Spring Boot「05」Annotations 02

Samson

Java Spring Boot 学习笔记 技术笔记 10月月更

jsbridge-n22使用指南

小鑫同学

前端 Node 10月月更

Python进阶(十六)正则表达式

No Silver Bullet

Python 正则表达式 10月月更

Web3.0杂谈-#005(52/100)

hackstoic

元宇宙 Web3.0

电商秒杀系统设计

张立奎

ReactNative-Android插件

小鑫同学

前端 Node 10月月更

MTPuTTY配置ssh连接Gitlab

Yeats_Liao

后端 Java core 10月月更

转转推荐场景EE题解决思路

转转技术团队

深度学习 推荐系统

Python进阶(十八)Python3爬虫小试牛刀之爬取CSDN博客个人信息

No Silver Bullet

Python 数据分析 10月月更

活跃开发者数量仅次于以太坊,波卡凭什么?

One Block Community

区块链 开发者 波卡生态

Rust编程语言中的定义类型

小鑫同学

前端 Node 10月月更

桌面端开发(Tauri)开启第一篇

小鑫同学

前端 Node 10月月更

容器云PaaS平台建设中应关注的重点和难点

穿过生命散发芬芳

10月月更 容器云PaaS

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