当前位置: 首页 > 编程笔记 >

PHP中Session可能会引起并发问题

薛霄
2023-03-14
本文向大家介绍PHP中Session可能会引起并发问题,包括了PHP中Session可能会引起并发问题的使用技巧和注意事项,需要的朋友参考一下

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

以上就是本文的全部内容了,希望大家能喜欢。

 类似资料:
  • 问题内容: 我正在做一个项目,我们正在其中生成一种可编译为Java的语言。我们正在使用的框架(xtext)在其生成的代码中大量使用了boxing。具体来说,如果您有如下声明: 然后,编译后的代码如下所示: 现在,在我正在研究的项目中,在某些情况下,特定的基本二进制运算将变得极为常见(尤其是增量和比较)。 我的问题是:这会在性能方面成为问题,还是JIT(或类似的智能JVM功能)会简单地了解正在发生的

  • 我想将JavaFX应用程序迁移到JDK11&OpenJFX,但我注意到SwingNode会引起问题。我决定创建一个新的项目,看看是怎么回事。有趣的是,当我切换到JDK8时,一切都很好。在较新的版本中,会出现错误。我不知道是因为什么。 VM选项:--module-path${PATH_TO_FX}--add-modules=javafx.controls,javafx.fxml

  • 我从solarQube中得到了以下一种错误=“NullPointerException可能会被抛出,因为这里的“a”可以为null”。下面是该错误的简单代码示例。 类别: 然后我有一个使用上面的类作为参数的方法: 我得到了SonarQube突出显示的的错误。我只是无法理解这些语句的问题。SonarQube描述的错误描述并没有让我更清楚。我如何修复它,有人能向我解释为什么它是错误吗?

  • 怎么了: 我有多个对象保存在一个arraylist中,该arraylist保存在一个gson字符串中。 我更改对象的类(以包含更多变量和getter/setter方法) 现在我在尝试加载较旧的对象(保存在步骤1中)时遇到错误 错误消息: 谢谢你的帮助!

  • 主要内容:PHP Session 变量,开始 PHP Session,实例,存储 Session 变量,实例,实例,销毁 Session,实例,实例PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。 PHP Session 变量 您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您

  • 问题内容: 我正在使用带注释的应用程序上下文()调用测试方法(Junit )。测试失败,并显示以下堆栈跟踪: 我认为问题是缺少方法()。我不确定如何正确读取行,加括号的圆括号使我感到困惑。我在applicationContext.xml和不同的Spring版本中尝试了不同的bean版本。 这是我的applicationContext: 问题答案: 我刚刚在Spring 4.1.1.RELEASE,