Open gmplato opened 4 years ago
你看下 /config/config.php 里的cache设置 这里可以设置session的存储媒介和过期时间 看下是否有问题
等等 你这边echo 之后返回页面可能被你忽略了输出 你试试直接返回看看
$this->response->correct(App::$base->session->logincode );
//缓存相关配置 'cache' => array( 'pkCache' => 'tb:%s', 'session' => array( 'save_handler'=>'files', //redis memcache 'maxlifetime' => 86400 //过期时间s ), // 开启redis自动序列化存储 'serialize' => true, ),
//config没有改过
用$this->response->correct(App::$base->session->logincode );
页面输出:{"flag":true,"ret":null}
你是先访问了一次 admin/newcode 是吗 要不你直接 使用$_SESSION看看呢 App::$base->session其实也就是对原生session进行了一层封装
@session_start(); $_SESSION['logincode'] = 'xxxx'; 另外一个路由 直接输出 $_SESSION['logincode']
如果不行的话 也可能是session相关的扩展没装或者php.ini没设置正确导致的 可以先试试
现在可以输出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'; //直接用字符串调试,还是未能同步输出
}
不知道问题出在那里了,不知道有什么解决思路。
不好意思 漏消息了 你是不是多台服务器 session默认是存本地文件的 所以可能存在一台机器写了session,第二次请求访问了其他机器就取不到session了
可以试试把session记在memcache或者redis中 这样多台机器就可以公用session了
老师,我上面提出的问题,在PHP7.0中测试没有遇到,PHP7.0正常运行。再分别在7.1、7.2、7.3.、7.4均发现是有问题的,专门分别两台服务器上测试过。请问这是一个什么问题?如何修复?
你找到框架里 Session.php里 @session_start(); 改成 session_start();看下 感觉在7.1环境下 session有报错 而@session_start()会屏蔽掉错误所以不可见了 你看下具体的错误信息再针对的修复一下吧
将 @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
看起来是7.1配置里session已经启动了导致的? 你看下php.ini 里 session.auto_start 设为0吧 不知道是不是这个原因导致的 可以百度一下看看
PHP7.0到7.4全部session.auto_start 默认都为0了。
还有这个问题挺奇怪的 可以把warning的错误 百度查一下 看看呢 刚查了下 意思是在执行这个session之前 已经注册过session_start 并设置过session的 ini_set导致的
好的,我上网找一下问题,尝试解决一下
老师,能力有限,处理不了,只有坐等修复了。先用着7.0
是我对Session 用法理解错误吗?
class adminAction extends baseAction{
public function action_newcode() { App::$base->session->logincode = 'JH2S'; // App::$base->session->close(); }
}