首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻塞会话存储

阻塞会话存储
EN

Stack Overflow用户
提问于 2016-03-24 18:45:17
回答 3查看 67关注 0票数 0

为了生成一个CSV文件,我们使用Guzzle来发出HTTP请求;我们使用的另一个组件是$_SESSION变量,用于存储有关生成不同文件的状态信息。

这种方法的主要问题是PHP阻塞了所有其他使用$_SESSION变量的请求。我们知道我们可以用一个叫做session_write_close()的函数来克服这个“问题”;

但是,我们仍然需要能够更新信息并将其存储在$_SESSION变量中,并且我们还应该能够在站点的其他部分使用$_SESSION信息;因此,应该“同步”这些信息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-24 19:18:43

PHP会话的实现假定会话数据是:

  1. 从备份存储中全部加载。
  2. 可能是在执行脚本时修改的。
  3. 全部写在它的后盾库里。

因此,例如,假设您实现了一个不实现锁定的会话处理程序,并且发生了以下一系列事件。

  1. 请求A从备份存储加载会话数据。
  2. 请求B从备份存储加载会话数据。
  3. 请求A修改$_SESSION‘’foo‘
  4. 请求B忙着做事情..。
  5. 请求A完成并将会话写入备份存储。
  6. 请求B完成并将会话写入备份存储,从而删除A所做的更改。

这就是为什么PHP的默认会话处理程序以及任何其他值其salt的会话处理程序在给定请求的持续时间内锁定每个会话的原因。

考虑到您需要在长时间运行的请求结束时写入数据,并且有多个并行运行,您可能根本不应该对这些数据使用会话,我建议使用数据库和事务。

票数 0
EN

Stack Overflow用户

发布于 2016-03-24 18:51:00

遗憾的是,为了确保请求不被阻塞,session_write_close正是您需要使用的。我的建议是,在开始生成CSV之前,在脚本开始时获取和设置所需的所有会话信息。然后调用session_write_close并继续创建CSV文件。

票数 0
EN

Stack Overflow用户

发布于 2016-03-24 19:00:50

您的问题是,您的请求花费的时间比典型的请求要长得多。原因是需要时间从脚本执行HTTP请求。这将导致阻塞会话文件的初始问题。

我可以看到两种解决你的问题的方法:

  1. 将与发出请求相关的逻辑卸载到不同的进程中,在不使用实际会话的情况下传递所需的所有信息(worker)。这可以通过使用队列甚至简单的cron脚本来实现,这些脚本可以从一些共享存储(如DB )中查看它需要做的事情。
  2. 放弃使用会话,或者至少放弃对会话使用阻塞存储。好的选择可能是:简单的DB表,需要信息,键值存储,比如memcached或Redis。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36207783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档