我写了两个方法,一个用于存储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版本贴下。
Base 类贴下。
文档的意思是session对象不要存储到全局变量里,否则影响session对象自动销毁从而影响自动存储。
最新版本,那应该怎么存取? 这玩意儿把我给整不会了...,非要调用save方法才管用...
最新版webman,使用你的代码,没有复现.
PHP 8.4.14 --没复现
PHP 8.3.27 --没复现
我觉得你应该检查一下你的Base中的session处理相关的代码
这是新框架 什么都还没写 所以也没写base
https://www.workerman.net/q/9616,看看这个 跟他一样
已经解决了, 原因是析构函数写了View::assign('request',$request);导致的,
构造函数内写了View::assign('request',$request);导致的!!!
遇到过类似的,一般都是某些地方的引用导致请求结束没有销毁session对象,没有调用保存。