Tencent / Biny

Biny is a tiny, high-performance PHP framework for web applications
BSD 3-Clause "New" or "Revised" License
1.69k stars 258 forks source link

同一控制器,不同的Action,Session没有生效? #104

Open gmplato opened 4 years ago

gmplato commented 4 years ago

是我对Session 用法理解错误吗?

class adminAction extends baseAction{

public function action_newcode() { App::$base->session->logincode = 'JH2S'; // App::$base->session->close(); }

public function action_login()
{
    echo App::$base->session->logincode;  //这里没有输出action_newcode的‘logincode‘;

    $view = $this->response->display('admin/login', $params);
    $view->title = '后台登陆界面';
    return $view;        
}

}

billge1205 commented 4 years ago

你看下 /config/config.php 里的cache设置 这里可以设置session的存储媒介和过期时间 看下是否有问题

billge1205 commented 4 years ago

等等 你这边echo 之后返回页面可能被你忽略了输出 你试试直接返回看看 $this->response->correct(App::$base->session->logincode );

gmplato commented 4 years ago

//缓存相关配置 'cache' => array( 'pkCache' => 'tb:%s', 'session' => array( 'save_handler'=>'files', //redis memcache 'maxlifetime' => 86400 //过期时间s ), // 开启redis自动序列化存储 'serialize' => true, ),

//config没有改过

gmplato commented 4 years ago

用$this->response->correct(App::$base->session->logincode );

页面输出:{"flag":true,"ret":null}

billge1205 commented 4 years ago

你是先访问了一次 admin/newcode 是吗 要不你直接 使用$_SESSION看看呢 App::$base->session其实也就是对原生session进行了一层封装

billge1205 commented 4 years ago

@session_start(); $_SESSION['logincode'] = 'xxxx'; 另外一个路由 直接输出 $_SESSION['logincode']

billge1205 commented 4 years ago

如果不行的话 也可能是session相关的扩展没装或者php.ini没设置正确导致的 可以先试试

gmplato commented 4 years ago
 现在可以输出session的值,但是我遇到的问题是,更改session的值后,要刷新请求多次页面才有改变。
 我现在在做登陆功能,生成验证码不能与session的值同步。
 public function action_login()
{
    echo App::$base->session->logtestkey;
    $view = $this->response->display('admin/login', $params);
    $view->title = '后台登陆界面';
    return $view;        
}

public function action_newcode() {

    $validate = new Captcha(4, 120, 30);
    $validate->img();   //生成图片并输出,可正常输出
    //App::$base->session->logtestkey = '$validate->code()'; 
    App::$base->session->logtestkey = 'apple112233';   //直接用字符串调试,还是未能同步输出      
}

不知道问题出在那里了,不知道有什么解决思路。

billge1205 commented 4 years ago

不好意思 漏消息了 你是不是多台服务器 session默认是存本地文件的 所以可能存在一台机器写了session,第二次请求访问了其他机器就取不到session了

billge1205 commented 4 years ago

可以试试把session记在memcache或者redis中 这样多台机器就可以公用session了

gmplato commented 4 years ago

老师,我上面提出的问题,在PHP7.0中测试没有遇到,PHP7.0正常运行。再分别在7.1、7.2、7.3.、7.4均发现是有问题的,专门分别两台服务器上测试过。请问这是一个什么问题?如何修复?

billge1205 commented 4 years ago

你找到框架里 Session.php里 @session_start(); 改成 session_start();看下 感觉在7.1环境下 session有报错 而@session_start()会屏蔽掉错误所以不可见了 你看下具体的错误信息再针对的修复一下吧

gmplato commented 4 years ago

将 @session_start();的@删除后,页面没有报错,在error.log中有大概这些警告: WARNING => Undefined variable: _SESSION WARNING => Undefined variable: params WARNING => ini_set(): Headers already sent. You cannot change the session module's ini settings at this time WARNING => session_start(): Cannot start session when headers already sent

1 /www/wwwroot/0123456789.club/lib/data/Session.php(56)

billge1205 commented 4 years ago

看起来是7.1配置里session已经启动了导致的? 你看下php.ini 里 session.auto_start 设为0吧 不知道是不是这个原因导致的 可以百度一下看看

gmplato commented 4 years ago

PHP7.0到7.4全部session.auto_start 默认都为0了。

billge1205 commented 4 years ago

还有这个问题挺奇怪的 可以把warning的错误 百度查一下 看看呢 刚查了下 意思是在执行这个session之前 已经注册过session_start 并设置过session的 ini_set导致的

gmplato commented 4 years ago

好的,我上网找一下问题,尝试解决一下

gmplato commented 4 years ago

老师,能力有限,处理不了,只有坐等修复了。先用着7.0