Codeigniter 3 - 会话不工作

Posted

技术标签:

【中文标题】Codeigniter 3 - 会话不工作【英文标题】:Codeigniter 3 - Session not working 【发布时间】:2015-09-13 05:17:39 【问题描述】:

我最近按照 codeigniter 的 website 中的更新程序将表单 2.2.x 更新为 3.0.0。 我在使用新的会话库时遇到了真正的问题 - 这是问题所在。

我们有一个登录部分,它依赖于子域和用户/密码凭据,将为您提供来自 ADMIN / RESELLER / CLIENT / USER 的某些权限

为了确定用户的正确权限,我们构建了一个我们称之为 Session_management 的客户库(位置:应用程序/库),该库不扩展核心 SESSION 驱动程序/库,并且从来没有也没有扩展到另一个类,这个库也是自动加载的,在 CI 3.0.0 之前一切正常。

Session_management 首先是__construct()

$this->CI =& get_instance();
$this->CI->load->model('users');
$this->CI->load->model('clients');
$this->CI->load->model('sessions');
$this->CI->load->driver('session');
$this->CI->load->library('password_hash');
$this->CI->load->helper('url');

$this->users = $this->CI->users;
$this->clients = $this->CI->clients;
$this->sessions = $this->CI->sessions;
$this->session = $this->CI->session;
$this->password_hash = $this->CI->password_hash;

在 CI 3.0.0 之前,我在使用方面没有任何问题

$this->CI->load->library('session');

但出于某种未知原因(对我而言)我必须通过驱动程序加载它

$this->CI->load->diver('session');

如果有人能解释为什么我必须这样做,那就太好了。

当用户提交他们的用户/传递凭据时,请求一个 CONTROLLER 会话/登录,首先运行表单验证,如果一切都成功,则调用 Session_management 登录方法。

$success = $this->session_management->login
  ($this->input->post('email'), $this->input->post('password'));

在 Session_management 类的 LOGIN 方法中,使用

设置了一堆会话
$this->session->set_userdata();

$this->session->set_userdata('user_id', 0);
$this->session->set_userdata('user_name', '');
$this->session->set_userdata('client_id', 0);
$this->session->set_userdata('client_administrator', 0);
$this->session->set_userdata('reseller_administrator', 0);

但是,当我 var_dump() 对其所有会话数据的会话时,它什么都没有,我不知道为什么会这样,除了我的受保护字段构成配置之外,没有会话数据存在,我已经对其进行了双重检查和三重检查,并且工作正常,我的 sess_save_path 正确存储会话文件,其余的 sess 配置也正确。

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = '/Users/******/Sites/********/tmp';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

这是我本地 OS X iMac 上的一个开发网站,正如我所说,在 CI 3.0.0 之前一切正常。

只是在我收到回复说“你需要使用”之前添加

$this->load->library('session');

我有“必须”将其加载为驱动程序,我别无选择,我已阅读文档并了解如何初始化会话 library。

如果我确实尝试将其作为库加载

$this->load->library('session');

这就是我得到的

A php Error was encountered

Severity: Notice
Message: Undefined property: Session::$session
Filename: libraries/Session_management.php
Line Number: 38

对于您的参考:第 38 行是:

$this->session = $this->CI->session;

这是在尝试加载会话库之后

$this->CI->load->library('session');

还要在此消息中添加回复:数据库会话/文件会话。 数据库会话是我的第一个选择,当我更改配置以使用数据库时,我已经修改了数据库列和索引以适应 CI 3.0.0,并且会话已经和正在存储在数据库表中,但是读取性能差异在高负载下的文件会话与数据库会话之间,文件会话将执行数据库会话,并且由于我正在创建的网站/平台将处于高负载状态,因此数据库会话不是前进的方向。

注意:该网站在 subdomain.domain.*** 结构下运行,其中子域在公司注册时注册为公司名称,即

mycompany.mywebsiteurl.com
anothercompany.mywebsiteurl.com

如前所述 - 在我更新到 CI 3.0.0 之前,它运行良好。

我还要补充一点:我已经检查了我的日志文件,我正在运行 tail -f 进行实时日志更新 - 它没有看到任何日志问题。

任何帮助、信息或任何可能使我朝着正确方向前进的东西都将不胜感激。

我也有posted on the CI forum。

【问题讨论】:

【参考方案1】:

带有必要文件和配置的 CI 3.0.0 新副本无法解决我的问题/问题。

问题的全部原因似乎是我有一个名为 Sesssion.php 的控制器,它的名称与驱动程序文件相同。

当 CI (Codeigniter) 调用时

$this->load->library('session')

在 CI 知道您要实际加载 CI_Session 类之前进行了一些检查... class_exists('Session') 返回 TRUE 并停在那里以避免致命错误。

希望这对其他人也有帮助。

【讨论】:

那么你如何解决你的问题呢?你可以根据它编辑你的答案吗?

以上是关于Codeigniter 3 - 会话不工作的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 中的会话变量不工作

如何使 Codeigniter 会话与边缘一起工作?

使用 CodeIgniter (3.1.0) 创建会话

Codeigniter 3 会话不适用于 PHP 7.1.4

Codeigniter 会话未保存在生产服务器上

CodeIgniter 会话 ID 更改且无法正常工作