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

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

  •  
  •   hheedat · 63 天前 · 1773 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。

    PHP 自带 session + memcached 这种的。

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

    22 回复  |  直到 2017-09-21 16:29:34 +08:00
        1
    wellsc   63 天前 via iPhone
    根据 session 时间戳加一层判断新旧会话的判断逻辑
        2
    hheedat   63 天前
    @wellsc 自带的没这个功能吧,就算能判断,去那个 cache 查是个黑盒
        3
    GTim   63 天前
    @hheedat 看 php5.6.3 这个包 ext/session/session.c l287-l433 这个代码怎么写

    或者 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3583605 这边文章,自己写一个算法
        4
    runningman   63 天前 via iPhone
    这是一个好问题
        5
    gouchaoer   63 天前 via Android
    没懂。。。你是说 session 到 memcache 的分片算法变了?
        6
    vainl1   63 天前
    @gouchaoer 我理解的是 PHP7 生成 session id 的算法变了,原本 a*** , 升级后 b***,然后题主大概 memcache 用的集群有分片,a*** 本来在 A 机器取得,现在映射到了别的机器,新旧的不一致会取不到。 另外题主可以关注一下 V2EX => 设置 => 关于头像的规则 。
        7
    azh7138m   63 天前 via Android
    解释一下,如果是男的,不建议使用女性头像,可能会小黑屋
        8
    gouchaoer   63 天前 via Android
    @vainl1 不,登录用户的 session 只会在登录成功后生成,cookie 会带上 sessionid 过来,所以和 session 生成算法无关。至于 memcache 集群分片算法,那就要去看扩展了,比如有基于 sessionid 取模的等等,改起来应该问题不大。其实用 memcache 集群分片存 session 比较粗暴简单的方法就是,把 memcache 的地址直接放 sessionid 里,比如 abc1hda76__memcache192.168.1.100 这样,当然 host 可以对称加密一下,这样有个好处就是可以水平扩展,某台挂了就踢掉别的不受影响
        9
    Niphor   63 天前
    系统近期升级,部分用户可能需要重新登录
    升级公告贴 2 天 然后再升级
        10
    skydiver   63 天前
    重新登录而已,多大点儿事儿
        11
    goodspb   63 天前
    分片都得 ID 竟然不是自己实现算法。。。
        12
    hheedat   63 天前
    @vainl1 已经生成的 sessionid,Cookie 中会带过来,PHP 自带的 session 会从配置的多个 memcache 地址中去取,本来应该在 A 地址取,现在变成在 B 地址取了,就取不到了(一部分 sessionid 会受影响,新登录的不会有影响)。

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

    有新消息记得回复我。
        17
    vlean   62 天前
    看下 http://php.net/manual/zh/session.configuration.php
    session.hash_function
    session.sid_length
        18
    vlean   62 天前
    @abccccabc 改成 files 应该不行 只是换了存储方式
        19
    owenliang   62 天前
    逐步升级 PHP7,让他们重登就好了。
        20
    shibingsw   62 天前
    @skydiver 对!!
        21
    Niphor   62 天前
    php56 到 php7 在 php_session_initialize 的时候只多了一个叫 s_validate_sid 的方法,接下来就直接透过 libmemcached 去读缓存了,这方法怎么用,还得看你编译时的 libmemcached 版本

    所以 我觉得要 debug,还是去找个用新版本的 libmemcached 的客户端,或者自己写个程序,尝试下出问题的 session_id,能不能 get 到
        22
    goodspb   62 天前
    楼主说的是不是 v2ex...!刚刚 V2EX 踢我下线了!。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   540 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 53ms · UTC 20:29 · PVG 04:29 · LAX 12:29 · JFK 15:29
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1