session感觉是不是有bug

xbb1314159

问题描述

我写了两个方法,一个用于存储session,一个用于获取session,无论怎么存,获取到都是最开始旧的那个数据,一旦我停止php start.php stop,再启动,他就会重新存一次,最后我使用了$session->save();,才得到解决,文档中有说什么session对象销毁时会自动保存session数据,可是我都压根不知道在哪里销毁的,文档也没有说,就连最简单的验证码功能都是这样的问题,一个生成图片存储session,然后在登录里验证上一次的session,这里获取到的始终是旧的

程序代码或配置

class Index extends Base{

    public function get(Request $request){
        return session('key');
    }

    public function set(Request $request){
        $session = $request->session();
        $session->set('key',$request->get('key'));
        $session->save();//不写这个他就不存最新的,就这两个简单的方法不必说我技术问题了吧
        return session('key');
    }
}

重现问题的步骤

这里官方文档的验证码方法,已去掉官方注释是因为我要说明一下问题所在

    public function login(){
        //这里始终获取到的是abcd,captcha方法反复刷新依旧获取的是abcd
        var_dump(session('captcha'));
    }

     public function captcha(Request $request)
    {

        $builder = new CaptchaBuilder;

        $builder->build();
        //这里把生成的字母转小写后存到session
        //比如现在验证码字母是abcd,那么他存进去了没问题,
        //那么假如再次刷新验证码是efgh,那么index方法里面获取出来永远是abcd,除非我重启php start.php restart
        $request->session()->set('captcha', strtolower($builder->getPhrase()));

        //实践发现这里必须写一个$request->session()->save();才会结局这个问题,官方说什么销毁自动保存,我现在怀疑这里不知道有什么bug,我的项目运行得好好的,这几天突然就发现登录不上去了,经过排查发现就是因为这个问题导致我的存session的admin数据压根在其他方法就获取不出来,因为压根就没存,之前是好好的,中间也出现过这个问题,我换了个php版本它又好了,罪魁祸首就是这个session的问题

        $img_content = $builder->get();

        return response($img_content, 200, ['Content-Type' => 'image/jpeg']);
    }

操作系统环境及workerman/webman等具体版本

353 3 2
3个回答

six

workerman版本贴下。
Base 类贴下。
文档的意思是session对象不要存储到全局变量里,否则影响session对象自动销毁从而影响自动存储。

  • xbb1314159 14天前

    最新版本,那应该怎么存取? 这玩意儿把我给整不会了...,非要调用save方法才管用...

小天天天天

最新版webman,使用你的代码,没有复现.
PHP 8.4.14 --没复现
PHP 8.3.27 --没复现

我觉得你应该检查一下你的Base中的session处理相关的代码

ichynul

遇到过类似的,一般都是某些地方的引用导致请求结束没有销毁session对象,没有调用保存。

  • 暂无评论
🔝