V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hheedat
V2EX  ›  PHP

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

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

    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 查是个黑盒
    GTim
        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 这边文章,自己写一个算法
    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   ·   我们的愿景   ·   实用小工具   ·   2873 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:50 · PVG 21:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.