我总是使用cookie和数据库自己实现会话处理,而不是通过php的ext / session api.
我用行锁和必要的隔离来做.我从未遇到过我的方法的并发问题,尽管我认为我没有足够的流量来暴露这些问题.
我最近被告知,分机/会话确实超出了人们的预期,而且比我想象的更复杂,这让我对我的方法提出质疑.
您能提供并发请求的示例以及ext / session解决数据不一致的方式吗?
最佳答案 通过基于文件的会话,ext / session在打开的会话上以文件锁的形式实现并发保护.文件锁会阻止打开会话文件的任何其他尝试,并且在会话关闭之前(在请求结束时或在显式使用
session_write_close
时)不会释放锁定.
这有效地序列化了对会话的访问,在该会话与一次写入的整个会话之间(而不是作为单独的值),不应该存在数据不一致的问题.
如果您正在使用自定义会话实现实现正确的锁定和隔离,那么您正在执行ext / session正在执行的操作,尽管使用不同的后备存储.
如果要使用PHP的SessionHandlerInterface和session_set_save_handler
实现自定义会话处理程序,可以通过将锁定作为开放实现的一部分来实现,并在关闭实现中释放锁定.
对于并发请求,逻辑流程看起来像这样:
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
由于在尝试打开会话之后(以及在接收会话数据之前)完全阻止了连接2,因此它不能采取任何可能扰乱有权访问会话数据的另一个连接中的数据的操作.
请注意,自定义会话处理程序必须正确实现锁定,否则您可能会因会话数据的多个并发访问而获得不一致的数据.这种不一致的形式取决于自定义处理程序如何实现读取和写入会话数据的确切细节.