PHP7 自带的 session 哈希算法变了,取不到 sessionid 怎么办? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hheedat
V2EX    PHP

PHP7 自带的 session 哈希算法变了,取不到 sessionid 怎么办?

  •  
  •   hheedat 2017-09-20 21:22:23 +08:00 6262 次点击
    这是一个创建于 2949 天前的主题,其中的信息可能已经有所发展或是发生改变。

    PHP 自带 session + memcached 这种的。

    PHP56 升级 PHP7,发现 session 自带的哈希算法变了,sessionid 落到了不同的 memcache 上,如果上线的话,很多用户会失去登录状态(有的还落在原来的 cache 上,有的不行,数量未知),这是不可接受的,有什么好办法吗?

    22 条回复    2017-09-21 16:29:34 +08:00
    wellsc
        1
    wellsc  
       2017-09-20 21:30:40 +08:00 via iPhone
    根据 session 时间戳加一层判断新旧会话的判断逻辑
    hheedat
        2
    hheedat  
    OP
       2017-09-20 21:52:21 +08:00
    @wellsc 自带的没这个功能吧,就算能判断,去那个 cache 查是个黑盒
    yemoluo
        3
    yemoluo  
       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 这边文章,自己写一个算法
    runningman
        4
    runningman  
       2017-09-20 22:05:28 +08:00 via iPhone
    这是一个好问题
    gouchaoer
        5
    gouchaoer  
       2017-09-20 22:07:28 +08:00 via Android
    没懂。。。你是说 session 到 memcache 的分片算法变了?
    vainl1
        6
    vainl1  
       2017-09-20 23:15:53 +08:00
    @gouchaoer 我理解的是 PHP7 生成 session id 的算法变了,原本 a*** , 升级后 b***,然后题主大概 memcache 用的集群有分片,a*** 本来在 A 机器取得,现在映射到了别的机器,新旧的不一致会取不到。 另外题主可以关注一下 V2EX => 设置 => 关于头像的规则 。
    azh7138m
        7
    azh7138m  
       2017-09-20 23:37:17 +08:00 via Android
    解释一下,如果是男的,不建议使用女性头像,可能会小黑屋
    gouchaoer
        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 可以对称加密一下,这样有个好处就是可以水平扩展,某台挂了就踢掉别的不受影响
    Niphor
        9
    Niphor  
       2017-09-21 00:01:17 +08:00
    系统近期升级,部分用户可能需要重新登录
    升级公告贴 2 天 然后再升级
    skydiver
        10
    skydiver  
       2017-09-21 00:05:10 +08:00
    重新登录而已,多大点儿事儿
    goodspb
        11
    goodspb  
       2017-09-21 00:22:56 +08:00
    分片都得 ID 竟然不是自己实现算法。。。
    hheedat
        12
    hheedat  
    OP
       2017-09-21 00:51:32 +08:00
    @vainl1 已经生成的 sessionid,Cookie 中会带过来,PHP 自带的 session 会从配置的多个 memcache 地址中去取,本来应该在 A 地址取,现在变成在 B 地址取了,就取不到了(一部分 sessionid 会受影响,新登录的不会有影响)。

    头像是允儿,用很久了,一直没注意规则,已换
    hheedat
        13
    hheedat  
    OP
       2017-09-21 00:52:05 +08:00
    @goodspb 历史原因
    torbrowserbridge
        14
    torbrowserbridge  
       2017-09-21 00:52:50 +08:00 via Android
    php7 的 session 存储与 memcached 扩展不兼容,已经切换到 redis
    dangyuluo
        15
    dangyuluo  
       2017-09-21 03:24:05 +08:00
    做个通告就好了,这都不是大事。session 里不保存重要信息就可以了
    abccccabc
        16
    abccccabc  
       2017-09-21 09:50:35 +08:00
    楼主,可以看看这篇文章: http://blog.csdn.net/doomsday0417/article/details/71087420

    有新消息记得回复我。
    vlean
        17
    vlean  
       2017-09-21 09:59:24 +08:00
    看下 http://php.net/manual/zh/session.configuration.php
    session.hash_function
    session.sid_length
    vlean
        18
    vlean  
       2017-09-21 10:01:12 +08:00
    @abccccabc 改成 files 应该不行 只是换了存储方式
    owenliang
        19
    owenliang  
       2017-09-21 11:49:12 +08:00
    逐步升级 PHP7,让他们重登就好了。
    shibingsw
        20
    shibingsw  
       2017-09-21 14:54:50 +08:00
    @skydiver 对!!
    Niphor
        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 到
    goodspb
        22
    goodspb  
       2017-09-21 16:29:34 +08:00
    楼主说的是不是 v2ex...!刚刚 V2EX 踢我下线了!。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     994 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 19:12 PVG 03:12 LAX 12:12 JFK 15:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86