关于系统自动退出问题的疑问,session和cookie的程序模块的疑问

2016-07-07 15:04 来源:www.chinab4c.com 作者:ecshop专家



ecshop的工程师和客服朋友们,非常感谢你们的辛苦给我们建站的店家提供了很好的一套系统!

我的系统出现了系统自动退出的问题。

我用的IE和FF浏览器,在使用中发现有时我正在后台操作中,后台突然退出登录,我只得重新登录一次。
询问过贵处的客服人员,他给我的建议是“选取自动登录”选项,但我这个系统会有两个管理员,每个人都有自己的账号,我并不希望系统自动登录。
针对这个问题,因为我自己也懂一些代码,查看了一下include/cls_session.php,其中有一段,是针对于 function update_session()这个函数的:
  1. /*大概是220行*/

  2. if (isset($data{255}))

  3. {

  4. $this->db->autoReplace($this->session_data_table,
  5. array('sesskey' => $this->session_id, 'expiry' =>
  6. $this->_time, 'data' => $data), array('data' => $data));



  7. $data = '';

  8. }
复制代码
琢磨了一下,这一段代码的意思是:如果session中的数据超过了255个字节,那么session的数据存入到ecs_session_data表中,否则就存入ecs_session表,并分别在两个表中记录expiry字段为session更新时间。

这时候我又尝试在后台做了几个操作,发现ecs_session表中的expiry字段的数据更新过了,但是ecs_session_data中的expiry字段的数据还是保持着我刚登录的值,并没有跟ecs_session表中的expiry字段一样被更新。

我的理解是,如果ecs_session_data中的expiry字段的值不被更新,那么在load_session函数的代码中,就会出现验证过期的情况:
  1. $session_data = $this->db->getRow('SELECT data, expiry FROM ' . $this->session_data_table . " WHERE sesskey = '" . $this->session_id . "'");
  2. if (!empty($session_data['data']) && $this->_time - $session_data['expiry'] <= $this->max_life_time)
  3. {
  4. $this->session_expiry = $session_data['expiry'];
  5. $this->session_md5 = md5($session_data['data']);
  6. $GLOBALS['_SESSION']= unserialize($session_data['data']);
  7. $GLOBALS['_SESSION']['user_id'] = $session['userid'];
  8. $GLOBALS['_SESSION']['admin_id'] = $session['adminid'];
  9. $GLOBALS['_SESSION']['user_name'] = $session['user_name'];
  10. $GLOBALS['_SESSION']['user_rank'] = $session['user_rank'];
  11. $GLOBALS['_SESSION']['discount'] = $session['discount'];
  12. $GLOBALS['_SESSION']['email'] = $session['email'];
  13. }
  14. else
  15. {
  16. $this->session_expiry = 0;
  17. $this->session_md5 = '40cd750bba9870f18aada2478b24840a';
  18. $GLOBALS['_SESSION']= array();
  19. }
复制代码
不知道是不是这个原因,我只得修改数据库中ecs_session_data中的expiry字段的值为去年(这样肯定过期了吧,原来ecshop规定的应该是1800秒=30分钟),然后我去后台,一操作(鼠标刚一点击),果然就退出了系统。

后来发现,原来在这一段代码中,没有更新expiry字段:
  1. if (isset($data{255}))
  2. {
  3. $this->db->autoReplace($this->session_data_table,array('sesskey' => $this->session_id, 'expiry' =>$this->_time, 'data' => $data), array('data' => $data));

  4. $data = '';
  5. }
复制代码
我个人认为,应该是修改成:
  1. if (isset($data{255}))
  2. {
  3. $data_expiry = $this->_time - $this->session_expiry;//更新expiry时间,首先要计算出当前时间和库中时间差
  4. $this->db->autoReplace($this->session_data_table,array('sesskey' => $this->session_id, 'expiry' =>$this->_time, 'data' => $data), array('expiry' => $data_expiry, 'data' => $data));

  5. $data = '';
  6. }
复制代码
但是我查询了本论坛中其他朋友针对于这一现象的提问,有一些只是针对于遨游浏览器,或者有一些是在前台,所以特意上来询问一下,不知道这是ecshop的bug,还是ecshop本身对这样的处理有特定的涵义呢?

回答:
刚刚又发现,在一段时间之内不操作,仍然会自动退出登录。但我已经把includes/init.php中的:
@ini_set('session.cache_expire',180);
修改成:
@ini_set('session.cache_expire',36000);
不知道这个是什么原因,在IE和FF下都有这个问题。。。
坐等……

你应该去设置cls_session里的var $max_life_time= 1800; // SESSION 过期时间,因为ecshop不是用php默认的session机制。你修改的很好,我也觉得这是ecshop的一个bug。前台用户因为还有用cookie,session没了,问题也不大,因为会重建。后台 选取自动登录 其实也是用cookie,不知道为什么官方一直不改这个简单的bug。

会员登陆成功后,点任何链接都自动退出返回登陆对话框,清除Cookie、换了多个浏览器和更换电脑登陆,依然自动退出!
大部分商品不能放入购物车,能放入购物车的商品,进入结算中心,又显示“您的购物车中没有商品!”,看了很多这方面的帖子,就是没有解决办法,这还怎么使用呀?

顶一下,只要是区域网的就有这个问题,老自动退出

后台不会自动退出吧?
前台确实 存在自动退出的问题 !