阻止会话存储

时间:2016-03-24 18:45:18

标签: php ajax session websocket

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

这种方法的主要问题是PHP会阻止使用$_SESSION变量的所有其他请求。我们知道我们可以通过一个名为session_write_close();

的特定功能来打败这个“问题”

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

3 个答案:

答案 0 :(得分:0)

可悲的是,session_write_close正是您需要使用的,以确保请求不会被阻止。我的建议是在开始生成CSV之前,在脚本开始时获取并设置所需的所有会话信息。然后致电session_write_close并继续创建CSV文件。

答案 1 :(得分:0)

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

我可以看到两个问题的解决方案:

  1. 卸载与将请求发送到不同进程相关的逻辑,该进程传递了所需的所有信息而没有实际的会话使用情况(worker)。这可以通过使用队列甚至简单的cron脚本来实现,这些脚本可以从一些共享存储(例如DB)中查看它需要做什么。

  2. 放弃使用会话或至少使用阻止存储进行会话。好的替代方案可能是:需要信息的简单数据库表,像memcached或Redis这样的键值存储。

答案 2 :(得分:0)

PHP会话是在假设会话数据为:

的情况下实现的
  1. 从后备商店全部加载。
  2. 在执行脚本时可能会被修改。
  3. 将其全部写入其后备商店。
  4. 因此,例如,让我们假设您实现了一个未实现锁定的会话处理程序,并发生以下事件序列。

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

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

      鉴于您需要在长时间运行的请求结束时写入数据并且还有多个并行运行,您可能根本不应该使用会话来获取此数据,我建议使用数据库交易。