大多数PHP框架的缓存和Session实现都没有考虑并发同步的问题

2013-10-10 10:52:23 +08:00
 tabris17
连Yii这种比较有名的框架也是如此,到底是作者根本没考虑到这些,还是他们觉得PHP也就用在普通web开发上不用很严谨
10722 次点击
所在节点    PHP
60 条回复
est
2013-10-10 12:48:13 +08:00
同一个用户的session,前者还没来得及往session里写入 1,后一个请求就马上要求写入2了,是这种并发同步吗?
tabris17
2013-10-10 12:50:03 +08:00
@est 对,导致的问题就是后一个请求写入的数据丢失,被前一个请求写入的数据覆盖了
raincious
2013-10-10 12:50:54 +08:00
@tabris17 我愚钝,但,除了这样,还能怎么办?写入之后就不给改么?
est
2013-10-10 12:57:04 +08:00
@tabris17 一般web framework都不会给session加锁。因为很有可能就做成deadlock了。这个时候你要反思下你的设计是不是有问题。可否避免往session里频繁写数据?

不要啥东西都往session里边放。
tabris17
2013-10-10 12:57:06 +08:00
@raincious 加锁啊。就像PHP默认的File类型session handle一样
tabris17
2013-10-10 12:59:59 +08:00
@est session是不会死锁的,因为两个session是不会相互访问对方数据的。
iodragon
2013-10-10 13:07:26 +08:00
@tabris17 我记得memcached是有锁的,memcache 3.0.4版本开始也支持加锁了,session这个本来就不是框架应该考虑的问题吧
Dlad
2013-10-10 13:10:27 +08:00
@tabris17 不理解“session并发同步“是什么意思。
具体到 配置session_set_save_handler 存进redis或者memcached里,会出现什么样的并发问题呢?
raincious
2013-10-10 13:34:10 +08:00
@tabris17 如果是为了防止在本次过程中的Session写入于读取不一致的问题,可以自行封装一个方法,先将Session将要写入memcache的数据存在某个变量里,读取的时候直接读取这个变量。写入方面用register_shutdown方法Late write到服务器上。

比如这样:
<script src="https://gist.github.com/raincious/3e5fac8b775697924f6b.js"></script>

用法
<script src="https://gist.github.com/raincious/6662bc0f3cf24ede7fe9.js"></script>
raincious
2013-10-10 13:34:57 +08:00
raincious
2013-10-10 13:38:03 +08:00
andyhuax
2013-10-10 17:25:51 +08:00
有些框架的session类里有session_write_close,用来处理这种session并发的问题,将session资源在请求结束前提前释放。
pubby
2013-10-10 18:03:18 +08:00
用户正常浏览,加上服务器响应正常时,貌似session互斥锁没啥意义啊

要用到同步,说明对写入数据有顺序要求,但是http协议本身就不保证这一点,

只能说这个需求太特殊了,自己实现下吧。
breeswish
2013-10-10 18:06:01 +08:00
首先。。优秀的代码都是在操作完SESSION之后立即session_write_close()的。。
其次。。PHP自己的SESSION是带文件锁的。。
Jex
2013-10-10 19:16:52 +08:00
这问题怎么提出来的?
session生成的每个ID都是唯一的,怎么可能出现其它用户覆盖你的数据的可能?
LZ你这是在?
Jex
2013-10-10 19:19:39 +08:00
缓存本来就没有一致性、持久性等保证,怎么可能还需要考虑并发读写同一条缓存?

LZ你没理解,你说的两个场景都是根本不需要考虑并发读写的问题
yangqi
2013-10-10 23:12:42 +08:00
@tabris17 基本上大部分框架默认肯定是用Php自己的session, 用户要改用sqlite或者别的当然要自己二次开发了,框架不可能把所有需求都开发了,否则也不叫框架了。。。
tabris17
2013-10-11 08:57:18 +08:00
@pubby 用户同时点开两个链接,并发请求这很常见,有些浏览器对于同一IP或站点限制的访问连接数可不止一个
tabris17
2013-10-11 09:00:33 +08:00
@raincious 不是复杂,而是严谨。虽然并发导致的问题在web应用中发生几率很低,而即便发生了也不太会导致致命错误。所以这个问题从来不被引起重视。至于Cache的一致性问题,由于Cache使用方式的局限性,所以也不会引起致命错误。但实际上错误还是会发生的。
tabris17
2013-10-11 09:01:53 +08:00
@breeswish 不。PHP的Sesssion handler只有内置的file handler是带同步的,而内置的sqlite handler和memcache handler都是不带同步的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/85066

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX