CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]

Posted

技术标签:

【中文标题】CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]【英文标题】:Is there any known bug in the session library of CodeIgniter 2.1.0? Why do I get kicked out? [closed]CodeIgniter 2.1.0 的会话库中是否有任何已知的错误?为什么我会被踢出去? [关闭] 【发布时间】:2013-05-20 06:19:08 【问题描述】:

我正在开发一个使用 CodeIgniter 2.1.0 创建的网站。

我注意到有时当我重新加载页面几次或非常快地打开几个页面时,或者当我在代码中出现错误(这些错误与会话无关)时,我会被注销。

本网站使用名为 Ion_authand 的库进行识别:

public function logged_in()

  $identity = $this->ci->config->item('identity', 'ion_auth');
  return (bool) $this->ci->session->userdata($identity);

是否有错误或我应该知道的事情?

$config['sess_cookie_name']  = 'cisession';
$config['sess_expiration']  = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name']  = 'cisession';
$config['sess_match_ip']  = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;

在这个网站上,几乎每个页面都会更新会话。

【问题讨论】:

有一个已知问题会导致 html 标头的 Content-Length 变得臃肿。这是因为每次向set_userdata()unset_userdata() 发出请求时,CI 都会发送整个“Set-Cookie”标头。这通常不是问题,但是如果您的用户使用严格的代理(大公司或教育机构),则很可能会导致会话完全失败。 github.com/EllisLab/CodeIgniter/issues/1345 还有一个关于会话和 ajax 调用的已知错误。 @Cryode 可能是它....有什么解决办法吗? 一个临时的解决方法是避免更新会话,如果它是一个 ajax 请求,但有时有它自己的警告。 See this SO question/answers,它会给你一些“解决方案”,并且有很多讨论的 CI 的 GitHub 问题的链接。 【参考方案1】:

这是我发现的:

CodeIgniter 的会话库中存在一个错误,它会破坏快速请求的会话。

您可以在此处找到有关此错误的更多信息:

https://github.com/EllisLab/CodeIgniter/issues/154

这个错误在最新的稳定版本 2.1.3 中仍然存在。

我已通过将会话库替换为来自 GitHub 的 CI3-DEV 的会话库来解决此问题:

https://github.com/EllisLab/CodeIgniter/blob/b211adee89f5fd2192051e9c0826146bd150f469/system/libraries/Session.php

并在我的配置中放置一个较长的 sess_expiration 和 sess_time_to_update ... 我的是 86400 和 86500。

【讨论】:

我会试一试.. 这个错误应该由 EllisLabs 修复.. 触摸木头,他们开始回到它上面 仍然是 2.1.4 中的一个问题,令人费解。最初,我立即从sess_update() 尝试了简单的returning,但是唉,这不起作用,即使是很长的sess_time_to_update。感谢您的回答,希望对您有所帮助。 @PaulSkinner 有点晚了,但是在你的配置中放了很长的 sess_expiration 和 sess_time_to_update .... 我的是 86400 和 86500【参考方案2】:

CodeIgniter 将会话数据保存在 cookie 中。如果会话数据中包含任何取消设置 cookie 的特殊字符,则会话也会被销毁。

它还会产生更多的大小限制问题。 Cookie 可以根据浏览器保存有限大小的数据。如果您尝试在 CodeIgniter 会话中存储更多数据,并且由于 CodeIgniter 尝试将其保存在 cookie 中,它可能不会保存超过该限制。

此外,由于 cookie 是通过网络发送的,它会不必要地增加网络流量。不应将所有会话数据保存在 cookie 中。

最好使用本机会话库。它使用 PHP 的原生会话。

https://github.com/EllisLab/CodeIgniter/wiki/Native-session

https://github.com/EllisLab/CodeIgniter/wiki/PHPSession

你可以比较两者。

有关 CodeIgniter 如何存储会话数据,请参阅 CodeIgniter 会话文档。

https://www.codeigniter.com/user_guide/libraries/sessions.html

【讨论】:

您是说它将会话数据保存在实际的 cookie 中吗?在服务器上? ...我以为它会将它们保存在数据库中? 是的,默认情况下 CI 仅将会话数据存储在 Cookie 中。您也可以将其存储在数据库中。但它仍然会保存在 Cookie+数据库中。请参考ellislab.com/codeigniter/user-guide/libraries/sessions.html thanx ,我知道,但是正如您在设置中看到的那样,我有 $config['sess_use_database'] = TRUE 所以这不是 cookie 的事情......我要测试 Native 会话,看看会发生什么 关于本机会话...我很困惑,它说system/application/libraries/native_session.php ..在我的系统目录中我没有application 目录...我应该创建它吗?还是引用codeigniter根目录下的application目录? 即使 $config['sess_use_database'] = TRUE,CI 也会将其存储到 cookie 和数据库中。

以上是关于CodeIgniter 2.1.0 的会话库中是不是有任何已知的错误?为啥我会被踢出去? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Codeigniter 中检查是不是设置了会话?

没有 Cookie 的 PHP 会话 | Codeigniter [关闭]

重定向后 CodeIgniter flashdata 不起作用

在Codeigniter下,是不是可以看到mysql_error()?

Codeigniter 3 - 从外部 Codeigniter 安装访问会话

如何在 CodeIgniter 的库中使用 session?