PHP Session 并发写 覆盖 问题

问题:如题

php session 默认采用文件保存的session,带来的问题是并发锁,并且不能让PHP多点部署。

这个时候一般就是注册PHP sessionhandler,比如用redis,memcache保存session,这样就不会有并发锁了。(当然你可以在设计sessionhandler时,把并发写考虑进去,但我不推荐这样做),没有锁,带来的另一个问题就是并发写,
——导致写覆盖。如下图:

就是说在 并发时,先来了 耗时操作,又来了一个不耗时的操作,两个请求都读取并改动了seesion,那么耗时操作的写入的数据就会覆盖之前写入。

这个问题在其他Web服务(不论是Java,C#,Python)都会出现。

解决否

已解决

方案

我的方案:首先,PHP文件session又并发锁,是不推荐使用的。再一个,用户运行时数据,不应该放到php session 里保存,session 应该只保存用户的登陆信息,也就是登陆的那一次请求写一次session,后续的操作都应只有读,不能再写。因为当你用php代码修改了session的值,session并不是立马写到磁盘(或者刷到redis上),而是等到该http请求结束时,再一并写入。

所以,建议就是session只能在登录时写一次,登出时删除。如果应用又存用户运行时数据的需求,建议使用redis,memcached,mysql 实时储存,也就是又编辑请求时,立马发出操作数据库的请求,而不是等到http请求结束时在做,避免并发写覆盖问题。使用redis,memcached保存数据的key可借用session id作为该用户的数据key。

网友的方案:https://blog.csdn.net/wuxing26jiayou/article/details/78961830