本地 xampp 服务器上的空会话

Posted

技术标签:

【中文标题】本地 xampp 服务器上的空会话【英文标题】:Empty sessions on local xampp server 【发布时间】:2017-12-26 17:29:43 【问题描述】:

我在 xampp 上本地运行的 php 站点上的会话存在问题。我有一个登录页面,它创建一个会话并重定向到登录区域。在登录区域中,检查 1) 会话变量是否为空,以及 2) 信息是否与数据库匹配。

登录时,第一步失败,所以会话变量为空。检查的具体代码如下:

if(!empty($this->session->userdata['auth']))
    return true;
else
    return false;

我从登录页面被发送到登录区域,所以我认为它至少在重定向我之前尝试创建会话,但我不确定如何检查以确定。

我最近在我的计算机上重新安装了操作系统和所有程序,包括 xampp,所以我假设问题就在那里。这个确切的代码在远程服务器上运行良好,并且在我在 xampp 中的旧本地系统上运行良好。

代码用CodeIgniter编写并加载会话库。

PHP 版本:7.1.4 CodeIgniter 版本:3.1.0 Xampp 版本:3.2.2

来自 config.php 的会话变量:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = sys_get_temp_dir();
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

来自 config.php 的 Cookie 变量:

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

编辑:

这是会话的设置方式:

$sessionArr = array(
    'userId'=> $userDetails->userId,
    'username'=> $userDetails->username,
    'email'=> $userDetails->email,
    'userType'=> $userDetails->userType
    );
$this->session->set_userdata('auth',$sessionArr);

【问题讨论】:

嗨,如果你 read doc 你可以这样做 if(!is_null($this->session->auth))//existelse//redirect 感谢您的回答!我现在尝试了这段代码,我遇到了同样的问题。我认为问题在于会话没有正确保存在我的本地主机上,因为它在远程主机上运行没有问题,但我不是 100% 确定。 为什么不检查 cookie 是否被发送/返回,是否创建了会话文件,是否有 php 引发的任何错误或警告? 我现在知道正在创建会话文件。我没有收到 PHP 的任何错误或警告,除非我强制脚本通过测试。然后我收到警告说我正在“尝试获取非对象的属性”,因为会话是空的。 【参考方案1】:

在您的项目中存储会话。

使用 APPPATH 或 FCPATH 我将 min 存储在缓存文件夹中。

$config['sess_save_path'] = APPPATH . 'cache/sessions/';

$config['sess_save_path'] = FCPATH . '/application/cache/sessions/';

确保文件夹权限为 0700

并使用() 而不是[]

if(!$this->session->userdata('userID')) 
    redirect('somecontroller')

我不确定你是如何设置会话的,虽然设置会话类似于

$sessionArr = array(
    'userId'=> $userDetails->userId,
    'username'=> $userDetails->username,
    'email'=> $userDetails->email,
    'userType'=> $userDetails->userType
    );
$this->session->set_userdata($sessionArr);

【讨论】:

感谢您的多条建议!我真的很感激帮助!我在应用程序文件夹中创建了一个缓存文件夹,并在 save_path 中使用了 APPATH。我现在知道它正在那里保存会话文件。我还仔细检查了文件权限,并更正了括号。我将在上面添加一个编辑以显示会话是如何设置的。 对不起,我忘记了答案中最后也是最重要的一句话:即使所有建议都已实施,问题仍然存在。 @Thomas 你有像$this->session->set_userdata('auth',$sessionArr); 这样的'auth' 试试$this->session->set_userdata($sessionArr); 然后使用$this->session->userdata('userID') @Thomas 我更新了我的答案codeigniter.com/user_guide/libraries/…【参考方案2】:

Codeigniter 3 的某些早期版本存在问题,这是一个bug 已在其网站上报告。基础会话错误已修复:

3.1.2 3.1.3 3.1.4

所以在最新版本的 Codeigniter 3 中这个问题不会发生。

解决方案:

如果您已经使用了错误版本的 codeigniter,请考虑将系统文件夹替换为 最新 版本的文件夹。撰写本文时版本为 3.1.7。

【讨论】:

【参考方案3】:

最终对我有用的是卸载 xampp 并安装以前的版本。我之前尝试过重新安装相同的版本,但没有成功。

【讨论】:

以上是关于本地 xampp 服务器上的空会话的主要内容,如果未能解决你的问题,请参考以下文章

本地主机 xampp 上的 500 内部服务器错误

如何通过我的 IP 地址而不是本地主机访问托管在 Xampp 服务器上的网站

xampp开发箱上的模拟邮件

本地机器上的两个 memcache 服务器

无法连接到 XAMPP 上的 FTP 服务器 (Mac)

数据表管理服务器的空JSON结果