PHP 自带 session + memcached 这种的。
PHP56 升级 PHP7,发现 session 自带的哈希算法变了,sessionid 落到了不同的 memcache 上,如果上线的话,很多用户会失去登录状态(有的还落在原来的 cache 上,有的不行,数量未知),这是不可接受的,有什么好办法吗?
1
wellsc 2017-09-20 21:30:40 +08:00 via iPhone
根据 session 时间戳加一层判断新旧会话的判断逻辑
|
3
GTim 2017-09-20 22:00:54 +08:00
@hheedat 看 php5.6.3 这个包 ext/session/session.c l287-l433 这个代码怎么写
或者 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3583605 这边文章,自己写一个算法 |
4
runningman 2017-09-20 22:05:28 +08:00 via iPhone
这是一个好问题
|
5
gouchaoer 2017-09-20 22:07:28 +08:00 via Android
没懂。。。你是说 session 到 memcache 的分片算法变了?
|
6
vainl1 2017-09-20 23:15:53 +08:00
@gouchaoer 我理解的是 PHP7 生成 session id 的算法变了,原本 a*** , 升级后 b***,然后题主大概 memcache 用的集群有分片,a*** 本来在 A 机器取得,现在映射到了别的机器,新旧的不一致会取不到。 另外题主可以关注一下 V2EX => 设置 => 关于头像的规则 。
|
7
azh7138m 2017-09-20 23:37:17 +08:00 via Android
解释一下,如果是男的,不建议使用女性头像,可能会小黑屋
|
8
gouchaoer 2017-09-20 23:50:02 +08:00 via Android
@vainl1 不,登录用户的 session 只会在登录成功后生成,cookie 会带上 sessionid 过来,所以和 session 生成算法无关。至于 memcache 集群分片算法,那就要去看扩展了,比如有基于 sessionid 取模的等等,改起来应该问题不大。其实用 memcache 集群分片存 session 比较粗暴简单的方法就是,把 memcache 的地址直接放 sessionid 里,比如 abc1hda76__memcache192.168.1.100 这样,当然 host 可以对称加密一下,这样有个好处就是可以水平扩展,某台挂了就踢掉别的不受影响
|
9
Niphor 2017-09-21 00:01:17 +08:00
系统近期升级,部分用户可能需要重新登录
升级公告贴 2 天 然后再升级 |
10
skydiver 2017-09-21 00:05:10 +08:00
重新登录而已,多大点儿事儿
|
11
goodspb 2017-09-21 00:22:56 +08:00
分片都得 ID 竟然不是自己实现算法。。。
|
12
hheedat OP @vainl1 已经生成的 sessionid,Cookie 中会带过来,PHP 自带的 session 会从配置的多个 memcache 地址中去取,本来应该在 A 地址取,现在变成在 B 地址取了,就取不到了(一部分 sessionid 会受影响,新登录的不会有影响)。
头像是允儿,用很久了,一直没注意规则,已换 |
14
torbrowserbridge 2017-09-21 00:52:50 +08:00 via Android
php7 的 session 存储与 memcached 扩展不兼容,已经切换到 redis
|
15
dangyuluo 2017-09-21 03:24:05 +08:00
做个通告就好了,这都不是大事。session 里不保存重要信息就可以了
|
16
abccccabc 2017-09-21 09:50:35 +08:00
|
17
vlean 2017-09-21 09:59:24 +08:00
|
19
owenliang 2017-09-21 11:49:12 +08:00
逐步升级 PHP7,让他们重登就好了。
|
21
Niphor 2017-09-21 15:58:55 +08:00
php56 到 php7 在 php_session_initialize 的时候只多了一个叫 s_validate_sid 的方法,接下来就直接透过 libmemcached 去读缓存了,这方法怎么用,还得看你编译时的 libmemcached 版本
所以 我觉得要 debug,还是去找个用新版本的 libmemcached 的客户端,或者自己写个程序,尝试下出问题的 session_id,能不能 get 到 |
22
goodspb 2017-09-21 16:29:34 +08:00
楼主说的是不是 v2ex...!刚刚 V2EX 踢我下线了!。
|