ext / session并发问题的例子?

时间:2016-02-04 07:24:41

标签: php session concurrency

我总是使用cookie和数据库自己实现会话处理,而不是通过php的分机/会话API。

我用行锁和必要的隔离来做。我从未遇到过我的方法的并发问题,尽管我认为我没有足够的流量来揭露这些问题。

我最近被告知,分机/会话确实超出了人们的期望,并且比我想象的要复杂得多,这让我质疑我的方法。

您能提供并发请求的示例以及ext / session解决数据不一致的方式吗?

1 个答案:

答案 0 :(得分:2)

通过基于文件的会话,ext/session在打开的会话上以文件锁的形式实现并发保护。文件锁会阻止打开会话文件的任何其他尝试,并且在会话关闭之前(在请求结束时或显式地使用session_write_close)锁定不会被释放。

这有效地序列化了对会话的访问,在会话和一次写入的整个会话之间(而不是作为单独的值),对于不一致的数据应该没有问题。

如果使用自定义会话实现实现正确的锁定和隔离,那么ext/session正在做同样的事情,尽管使用不同的后备存储。

如果要使用PHP的SessionHandlerInterfacesession_set_save_handler实现自定义会话处理程序,可以通过将锁定作为open实现的一部分来实现,并将锁定释放为您close实施的一部分。

对于并发请求,逻辑流程将如下所示:

Connection 1          Connection 2
session open          session open - blocks
session read          //blocked
// do stuff           //blocked
session write         //blocked
session close         //blocked
                      session open returns
                      //reset of session handling as per normal

由于Connection 2在尝试打开会话后(以及在接收会话数据之前)被完全阻止,因此它无法采取任何可能扰乱其他连接中有权访问会话数据的数据的操作

请注意,自定义会话处理程序必须正确实现锁定,否则您可能会因会话数据的多个并发访问而获得不一致的数据。这种不一致的形式将取决于自定义处理程序如何实现读取和写入会话数据的确切细节。