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

2013-10-10 10:52:23 +08:00
 tabris17
连Yii这种比较有名的框架也是如此,到底是作者根本没考虑到这些,还是他们觉得PHP也就用在普通web开发上不用很严谨
10894 次点击
所在节点    PHP
60 条回复
yangqi
2013-10-10 11:04:32 +08:00
这些本身不属于框架里的,一般框架都是给出最简单的一些功能, 还是需要进行二次开发的
Dlad
2013-10-10 11:39:42 +08:00
缓存的并发同步应由缓存考虑,Session的并发同步php提供了函数,需要自己做,代码量不大。
可能框架设计者觉得没有必要吧。
civoic
2013-10-10 11:56:39 +08:00
并发同步的什么问题?是指多用户并发时同时写同一个缓存,出现冲突的问题吗?
mahone3297
2013-10-10 12:00:34 +08:00
没有明白lz 的意思,说说?你是想说大并发下,数据加锁?
raincious
2013-10-10 12:02:18 +08:00
Session什么的,可以用PHP自己的session函数组,然后在php.ini里面将session储存方式修改为memcache服务器。冲突什么的交给memcache自己解决。
tabris17
2013-10-10 12:03:17 +08:00
@yangqi 组件防止并发冲突当然是基本的要求
@Dlad Session同步PHP没有相关内置函数的,PHP的默认的File类型Session handle是有加文件锁同步的,但是PHP内置的memcached session handle是没有同步的
@civoic 是的。比如Yii的CFileCache实现,是不加锁的,缓存lifetime靠touch函数修改filemtime来实现,如果并发访问会有冲突
tabris17
2013-10-10 12:05:31 +08:00
@raincious 我测试过PHP内置的memcache session handle,是没有同步的,并发时会产生冲突,只是大多数浏览器对同一站点使用一个HTTP连接同步访问的,所以问题不明显。
luikore
2013-10-10 12:07:17 +08:00
前面 nginx 再加个 http_limit 限制单 ip 并发数, 消灭并发就没并发问题了...
yangqi
2013-10-10 12:07:20 +08:00
@tabris17 session应该算基本的组件, cache算不上基本的要求, 一般框架都只是做简单的开发, 肯定需要二次开发. session没考虑并发? 不知道LZ具体指的是什么, 给点代码会比较好
tabris17
2013-10-10 12:07:29 +08:00
@mahone3297 是的
tabris17
2013-10-10 12:09:43 +08:00
@luikore 这样只能解决session的同步问题
Ever
2013-10-10 12:11:48 +08:00
https://code.google.com/p/memcached/wiki/NewProgrammingFAQ#Is_memcached_atomic?

Is memcached atomic?
Aside from any bugs you may come across, yes all commands are internally atomic. Issuing multiple sets at the same time has no ill effect, aside from the last one in being the one that sticks.
tabris17
2013-10-10 12:17:06 +08:00
tabris17
2013-10-10 12:20:44 +08:00
@Ever PHP session同步问题和session handle的存储类型无关,而是和PHP的session实现机制有关
civoic
2013-10-10 12:24:52 +08:00
@tabris17 filecache什么的,可以打开同一个文件同时写入的么?
另外,你上面发的这个例子,是否要考虑服务器对于单ip的http请求是并发处理还是同步处理的情况。
yangqi
2013-10-10 12:27:43 +08:00
@tabris17 这个和框架有什么关系, 看下面这个. 你那个例子里面应该是那个sleep(10)导致session file一直被lock, 10秒, 第二个session当然无法写入了

http://konrness.com/php5/how-to-prevent-blocking-php-requests/
tabris17
2013-10-10 12:41:48 +08:00
@civoic 打开同一个文件同时写当然是可以的,否则file_put_contents也不用提供LOCK_EX标志做参数了。问题不在于同时写入同一文件,而在于访问缓存必须是原子操作。
tabris17
2013-10-10 12:42:42 +08:00
@yangqi 我已经说过了,默认file类型的session handle是用文件锁实现同步的,而memcache和sqlite作为session handle是没有同步措施的
tabris17
2013-10-10 12:44:03 +08:00
@yangqi 而大多数框架实现的session handle也都是没有考虑同步的
raincious
2013-10-10 12:46:24 +08:00
@tabris17 嗯……四不像兄,我觉得这是你的需求太复杂了。一般框架都不会这样封装甚至是这样处理。因为这涉及到业务层的东西。我自己设计框架的时候直接将Session部分忽略了,框架用户必须自己设计适合自己的Session。

另外如果自己封装的话,一切问题就都很好解决了。比如用直接用数据库或者直接调用memcache。

此外个人觉得php的session并不适用各种环境,只是一种简单的解决方案。我宁愿自己写个Session管理器来处理这些东西。

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

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

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

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

© 2021 V2EX